มี VB.NET เทียบเท่ากับพารามิเตอร์ C # out หรือไม่?


96

VB.NET มีคุณสมบัติเทียบเท่ากับoutพารามิเตอร์ฟังก์ชันC # โดยตรงหรือไม่โดยที่ตัวแปรส่งผ่านไปยังฟังก์ชันไม่จำเป็นต้องเริ่มต้น

คำตอบ:


99

ไม่ไม่มีoutคำหลักที่เทียบเท่าใน VB

อย่างไรก็ตาม VB จะเริ่มต้นตัวแปรโลคัลทั้งหมดโดยอัตโนมัติในวิธีการหนึ่งดังนั้นคุณสามารถใช้ByRefโดยไม่จำเป็นต้องเริ่มต้นตัวแปรอย่างชัดเจนก่อน

ตัวอย่าง:

Sub Main()
  Dim y As Integer
  Test(y)
End Sub

Sub Test(ByRef x As Integer)
  x = 42
End Sub

(หากคุณตรวจสอบโค้ดในเฟรมเวิร์ก (เช่นDouble.TryParse ) คุณอาจเห็น<OutAttribute>พารามิเตอร์ที่เพิ่มเข้ามา แต่จะสร้างความแตกต่างได้ก็ต่อเมื่อมีการเรียกใช้การเรียกใช้ COM interop หรือเรียกใช้แพลตฟอร์ม)


2
@Spolto: หากคุณกำลังแปล VBScript เป็น VB คุณควรแน่ใจว่าได้ตั้งค่าโหมดชัดเจนและเข้มงวดแล้ว มันจะทำให้คุณได้รับข้อความแสดงข้อผิดพลาดมากขึ้น แต่ส่วนใหญ่จะชี้ไปที่ต้นตอของปัญหา (เช่นตัวแปรที่ประกาศโดยไม่มีประเภท) มากกว่าปัญหารอง (เช่นตัวแปรที่ประกาศโดยไม่มีประเภทจะกลายเป็นObjectดังนั้นจึงไม่สามารถใช้เป็นByRef x As Integerพารามิเตอร์ได้)
Guffa

4
@Guffa: ฉันไม่รู้ว่ามันเป็นเวอร์ชันหรือเปล่า แต่ฉันก็รับคำเตือนของคอมไพเลอร์เช่นกันเมื่อส่งตัวแปรประเภทอ้างอิงที่ไม่ได้กำหนดค่าเริ่มต้นเป็นByRefพารามิเตอร์ (ไม่ได้เกิดขึ้นกับพารามิเตอร์ประเภทค่า)
Dan Tao

4
@ Dan Tao, Spolto: นั่นดูเหมือนจะแตกต่างฉันได้รับคำเตือนพร้อมประเภทอ้างอิงด้วย การไม่สามารถระบุพารามิเตอร์เป็นข้อ จำกัด ในภาษาและคุณต้องเริ่มต้นตัวแปรเพื่อกำจัดคำเตือน แม้แต่การมอบหมายNothingให้พวกเขาก็จะกำจัดคำเตือนออกไปแม้ว่าผลลัพธ์จะไม่เปลี่ยนแปลงก็ตาม
Guffa

1
@ กัฟฟา: ใช่ฉันได้มอบหมายNothingให้พวกเขาแล้ว มันใช้เวลานานเพราะฉันต้องทำมันหลายร้อยครั้งในเว็บไซต์ดั้งเดิมขนาดใหญ่ ขอบคุณสำหรับการตรวจสอบ
cspolton

3
@MarkHurd: จากนั้นการโหวตลดก็ไม่ยุติธรรมเพราะฉันได้กล่าวไปแล้วว่าOutแอตทริบิวต์ไม่เทียบเท่ากับoutคีย์เวิร์ดC #
Guffa

32

ไม่ไม่มีโครงสร้างที่เทียบเท่ากันที่อนุญาตให้ส่งผ่านตัวแปรที่ไม่ได้เริ่มต้นไปยังเมธอดโดยไม่มีคำเตือน แต่ดังที่ได้กล่าวไว้ในคำถามและคำตอบของฉันที่ระบุ<Out()>แอตทริบิวต์ในByRefนิยามพารามิเตอร์แม้ว่า VB จะละเว้น แต่จะได้รับการปฏิบัติโดย C # เป็นoutพารามิเตอร์

ดังนั้นฉันจะเริ่มต้นตัวแปรอ้างอิงล่วงหน้าNothing และระบุ<Out()> ByRefเพื่อแสดงเจตนา (ซึ่งจะใช้ได้ผลถ้าผู้ใช้ C # เคยเข้าถึงวิธีการของคุณ)

หากคุณรู้สึกว่าคุณรู้ว่าเมื่อใดที่คุณต้องการเข้าถึงค่าเริ่มต้นNothingในตัวแปรอ้างอิงที่ไม่ได้กำหนดไว้เป็นอย่างอื่นคุณสามารถตั้งค่า "การกำหนดค่าคำเตือน" "การใช้ตัวแปรก่อนกำหนด"เป็น"ไม่มี"ที่ระดับโครงการ (คุณสมบัติโครงการ> คอมไพล์และคุณอาจ ต้องการตั้งค่าการกำหนดค่าที่ "การตั้งค่าทั้งหมด" ก่อนที่จะเปลี่ยนการตั้งค่านี้) หรือใน VS2015 (VB.NET 14) #Disable Warning BC42030คุณสามารถใช้


3
นี่เป็นสิ่งสำคัญ ฉันมีคลาสย่อย VB ของ MembershipProvider แล้วคลาสย่อย C # ของคลาสย่อย VB รหัส C # ไม่ตระหนักถึงความจริงที่ว่าวิธีการนามธรรมใน MembershipProvider ได้ถูกนำไปใช้แล้วจนกว่าฉันจะใช้แอตทริบิวต์ในคลาส VB สำหรับพารามิเตอร์ที่ระบุไว้ในคลาสฐาน MembershipProvider
Richard Collette

@RichardCollette น่าจะเป็นคำตอบสำหรับคำถามที่เชื่อมโยงของฉัน!
Mark Hurd

9

รุ่น C #

  void TestFunc(int x, ref int y, out int z) {
  x++;  
  y++;
  z = 5;
}

เวอร์ชัน Vb.net

    Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
  x += 1
  y += 1 
  z = 5 
End Sub

พบคำตอบได้ที่นี่

อัปเดต

ตามที่ระบุไว้ในความคิดเห็นอย่าลืมเริ่มต้นพารามิเตอร์ของคุณที่จะใช้ในช่องเอาต์


โดยทั่วไปแล้วผมยอมรับว่าByRefเป็นสิ่งที่ใกล้เคียงกับการ อย่างไรก็ตามByRefจะยังคงส่งคำเตือนหากคุณส่งตัวแปรที่ไม่ได้กำหนดค่าเริ่มต้นตามที่คำถามถาม
Richard

การโหวตลงคะแนนของฉันเกิดขึ้นเมื่อไม่นานมานี้: เว็บไซต์ที่คุณเชื่อมโยงเป็นเรื่องธรรมดามาก มันไม่ได้ระบุปัญหาเฉพาะความแตกต่างและทางเทคนิค นอกจากนี้คำตอบของคุณยังไม่ตอบคำถาม
Mark Hurd

1

ฉันมีปัญหาใน VB.NET ที่ฉันเรียกว่าฟังก์ชัน "by ref" ที่ส่งอาร์เรย์กลับ

แม้ว่าคอมไพลเลอร์จะตั้งค่าสถานะว่าเป็นคำเตือน แต่ก็ใช้ได้ การแก้ไขนั้นง่ายมากและอาจเป็นการฝึกเขียนโปรแกรมที่ดี

ฉันเปลี่ยนไป

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

ถึง

' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing

fnRetArray(m_arr_values)

นอกจากนี้ยังช่วยในการเข้ารหัสหากชื่อตัวแปรเป็นคำอธิบาย ...

Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
    ...
End Sub

3
สัญลักษณ์ภาษาฮังการีขัดต่อแนวทางการออกแบบ. NET framework
Gqqnbig

0

คุณสามารถใช้ pass by reference method ใน VB.NET

คุณต้องมีกลไกพารามิเตอร์ Out ใน C # เนื่องจากไม่อนุญาตให้คุณใช้ตัวแปรใด ๆ โดยไม่ต้องเริ่มต้น

VB.NET ไม่จำเป็นต้องมีคีย์เวิร์ดพิเศษเพราะมันทำด้วยตัวเองโดยอัตโนมัติ

เพียงใช้ ByRef


3
สิ่งนี้ไม่ได้ตอบคำถามและเป็นเรื่องผิดเกี่ยวกับ C #
cspolton

byref ช่วยให้คุณไม่สามารถเริ่มต้นและอนุญาตให้คุณเปลี่ยนค่าพารามิเตอร์ แต่ในทางตรงกันข้ามกับพารามิเตอร์ C # out จะอนุญาตให้คุณเริ่มต้นพารามิเตอร์ด้วยค่าและใช้ในฟังก์ชันในขณะที่ใน C # คีย์เวิร์ด out บังคับให้คุณใช้สิ่งนี้เป็นพารามิเตอร์นอกเท่านั้นและไม่เป็นอินพุตของ ฟังก์ชั่น. นอกจากนี้หากคุณไม่เปลี่ยนหรือตั้งค่าเป็นพารามิเตอร์นี้ภายในฟังก์ชันของคุณคอมไพลเลอร์จะไม่จับว่าเป็นข้อผิดพลาดตรงข้ามกับ C # ที่จะมีการออกข้อผิดพลาดในการคอมไพล์
pashute

0

VB มีแอตทริบิวต์ที่ควรจะเหมือนกับ C # out แต่วันนี้คุณยังคงได้รับคำเตือนแม้ว่าคุณจะใช้มันก็ตาม มีรายละเอียดเกี่ยวกับการแก้ไขในพื้นที่ vblang ของ github https://github.com/dotnet/vblang/issues/67


-5

ใช้คำหลักByRefก่อนตัวแปร


4
ByRefเทียบเท่ากับrefพารามิเตอร์ใน C # ซึ่งจำเป็นต้องเริ่มต้นก่อนที่จะส่งผ่านไปยังฟังก์ชัน
cspolton
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.