Có VB.NET tương đương với các tham số C # ra không?


95

VB.NET có tương đương trực tiếp với outcác tham số hàm C # , trong đó biến được truyền vào một hàm không cần khởi tạo không?

Câu trả lời:


98

Không, không có outtừ khóa tương đương trong VB.

Tuy nhiên, VB không tự động khởi tạo tất cả các biến cục bộ trong một phương thức, vì vậy bạn có thể sử dụng ByRefmà không cần phải khởi tạo biến trước một cách rõ ràng.

Thí dụ:

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

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

(Nếu bạn kiểm tra mã trong khuôn khổ (ví dụ: Double.TryParse ), bạn có thể thấy các <OutAttribute>tham số được thêm vào, nhưng điều đó chỉ tạo ra sự khác biệt khi lệnh gọi được điều phối cho COM interop hoặc nền tảng gọi.)


2
@Spolto: Nếu bạn đang dịch VBScript sang VB, bạn nên đảm bảo bật chế độ Rõ ràng và Nghiêm ngặt. Nó sẽ giúp bạn nhận được nhiều thông báo lỗi hơn, nhưng hầu hết sẽ chỉ ra nguồn gốc của các vấn đề (ví dụ: biến được khai báo không có kiểu) hơn là các vấn đề thứ cấp (ví dụ: biến được khai báo mà không có kiểu trở thành Object, vì vậy nó không thể được sử dụng cho một ByRef x As Integertham số).
Guffa

4
@Guffa: Tôi không biết đó có phải là phiên bản hay không, nhưng tôi cũng nhận được cảnh báo của trình biên dịch khi chuyển các biến kiểu tham chiếu chưa được khởi tạo làm ByReftham số. (Nó không xảy ra với các tham số kiểu giá trị.)
Dan Tao

4
@Dan Tao, Spolto: Đó có vẻ là sự khác biệt, tôi cũng nhận được một cảnh báo với các loại tham chiếu. Việc không thể chỉ định các tham số là một hạn chế trong ngôn ngữ và bạn chỉ cần khởi tạo các biến để loại bỏ các cảnh báo. Ngay cả việc gán Nothingcho họ cũng sẽ loại bỏ sự kiện cảnh báo mặc dù nó không thay đổi kết quả.
Guffa

1
@Guffa: Vâng, tôi đã chỉ định Nothingcho họ cho đến nay. Nó chỉ tốn thời gian vì tôi phải làm điều đó hàng trăm lần trong một trang web kế thừa lớn. Cảm ơn bạn đã điều tra.
cspolton

3
@MarkHurd: Vậy thì downvote là không công bằng, vì tôi đã nói rằng Outthuộc tính không tương đương với outtừ khóa C # .
Guffa

32

Không, không có cấu trúc tương đương nào cho phép một biến không khởi tạo được chuyển đến một phương thức mà không có cảnh báo, nhưng, như đã đề cập trong câu hỏi và câu trả lời của tôi , chỉ định một <Out()>thuộc tính trên ByRefđịnh nghĩa tham số, mặc dù VB bỏ qua nó, được xử lý bởi C # như một outtham số.

Vì vậy, tôi sẽ khởi tạo trước các biến tham chiếu đến Nothing chỉ định <Out()> ByRefđể biểu thị ý định (điều đó sẽ hoạt động nếu người dùng C # từng truy cập các phương thức của bạn).

Nếu bạn cảm thấy bạn biết khi nào bạn dự định truy cập mặc định Nothingtrong các biến tham chiếu chưa được gán, bạn có thể đặt "Cấu hình cảnh báo" "Sử dụng biến trước khi gán" thành "Không" ở cấp Dự án (Thuộc tính dự án> Biên dịch, và bạn có thể muốn đặt Cấu hình thành "Tất cả Cấu hình" trước khi thay đổi cài đặt này) hoặc, trong VS2015 (VB.NET 14), bạn có thể sử dụng #Disable Warning BC42030.


3
Điều này là đáng kể. Tôi đã có một lớp con VB của MemberhipProvider và sau đó là một lớp con C # của lớp con VB. Mã C # không nhận ra thực tế là các phương thức trừu tượng trong MemberhipProvider đã được triển khai cho đến khi tôi áp dụng thuộc tính trong lớp VB cho các tham số đã được chỉ định trong lớp cơ sở MemberhipProvider.
Richard Collette

@RichardCollette Đó có lẽ đáng là câu trả lời cho câu hỏi được liên kết của tôi!
Mark Hurd

9

Phiên bản C #

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

Phiên bản vb.net

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

Tìm thấy câu trả lời ở đây

Cập nhật

Như đã nêu trong nhận xét, đừng quên khởi tạo tham số của bạn sẽ được sử dụng trong khe cắm ngoài


Nói chung, tôi đồng ý rằng ByRef là điều gần nhất với ra . Tuy nhiên, ByRef vẫn sẽ đưa ra cảnh báo nếu bạn chuyển một biến chưa được khởi tạo, như câu hỏi đặt ra.
Richard

Phản đối của tôi đã khá lâu trước đây: Trang web bạn đã liên kết đến rất chung chung; nó không liệt kê các vấn đề cụ thể, sự khác biệt và kỹ thuật. Ngoài ra câu trả lời của bạn vẫn không trả lời câu hỏi.
Mark Hurd

1

Tôi đã gặp sự cố trong VB.NET mà tôi đã gọi một hàm "by ref" đã chuyển lại một mảng.

Mặc dù trình biên dịch đã gắn cờ nó như một cảnh báo, nó vẫn ổn. Cách khắc phục là siêu đơn giản và có thể là thực hành lập trình tốt.

tôi đã thay đổi

Dim m_arr_values() as Integer

fnRetArray(m_arr_values)

đến

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

fnRetArray(m_arr_values)

Nó cũng hữu ích khi mã hóa nếu tên biến mang tính mô tả ...

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

3
Ký hiệu Hungary chống lại hướng dẫn thiết kế khung .NET.
Gqqnbig

0

Bạn có thể sử dụng phương thức chuyển bằng tham chiếu trong VB.NET.

Bạn cần cơ chế tham số Out trong C #, vì nó không cho phép bạn sử dụng bất kỳ biến nào mà không khởi tạo nó.

VB.NET không cần một từ khóa đặc biệt vì nó tự động làm điều đó.

Chỉ cần sử dụng ByRef.


3
Điều này không trả lời câu hỏi và nó sai đối với C #.
cspolton

Byref cho phép bạn không khởi tạo và cho phép bạn thay đổi giá trị tham số. Tuy nhiên, trái ngược với tham số C # out, nó KHÔNG CHO PHÉP bạn khởi tạo tham số với một giá trị và sử dụng nó trong hàm, trong khi trong C #, từ khóa out buộc bạn CHỈ sử dụng điều này làm tham số ra chứ KHÔNG phải đầu vào cho chức năng. Ngoài ra, nếu bạn không thay đổi hoặc đặt giá trị cho tham số này trong hàm của bạn, trình biên dịch sẽ không coi đó là lỗi, trái ngược với C #, nơi lỗi biên dịch sẽ được đưa ra.
pashute


-5

Sử dụng từ khóa ByRef trước biến.


4
ByReftương đương với refcác tham số trong C #, cần được khởi tạo trước khi chuyển vào một hàm.
cspolton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.