2012-09-12 14 views
12

Trong C#, một từ khóa của tài sản value từ khóa sẽ tự động giống như loại của thuộc tính.Tại sao trình thiết lập thuộc tính VB.NET yêu cầu một đối số đã nhập và tại sao nó là ByVal?

Ví dụ, trong C#, loại valuestring

private string str = string.Empty; 
public string MyText 
{ 
    get { return str; } 
    set { str = value; } 
} 

Nếu chúng ta chuyển đổi đoạn này để VB.Net chúng tôi nhận

Private str As String = String.Empty 
Public Property MyText() As String 
    Get 
     Return str 
    End Get 
    Set(ByVal value As String) 
     str = value 
    End Set 
End Property 

Câu hỏi

  1. Tại sao thiết lập có lin này e Set(ByVal value As String)? Không nên nhập giá trị loại tự động là Chuỗi. Cách này.

    Private str As String = String.Empty 
    Public Property MyText() As String 
        Get 
         Return str 
        End Get 
        Set 
         str = value 
        End Set 
    End Property 
    

    Việc sử dụng điều đó là gì?

  2. Tôi không thể thay đổi BYVal thành ByRef (Tôi đã thử, nó cung cấp lỗi), sau đó sử dụng điều đó cũng như thế nào?

+3

Câu hỏi hay, không chắc chắn tại sao nó được đưa ra -1 ngay lập tức. –

+0

@AlastairPitts: Có thể do tiêu đề gây nhầm lẫn. –

Trả lời

9

Bạn có thể bỏ qua phần (ByVal value As String). Visual Studio sẽ tiếp tục thêm nó, nhưng nó không được yêu cầu bởi ngôn ngữ hoặc trình biên dịch.

Bạn có thể sử dụng tên thông số khác ngoài value. Cũng lưu ý rằng kể từ VS2010 SP1, bạn có thể bỏ qua từ khóa ByVal.


Ví dụ:

Class Test 

    Private str As String = String.Empty 

    Public Property MyText() As String 
     Get 
      Return str 
     End Get 
     Set 
      str = value 
     End Set 
    End Property 

    Public Property MyText2() As String 
     Get 
      Return str 
     End Get 
     Set(something As String) 
      str = something 
     End Set 
    End Property 

End Class 
+0

Hey nếu tôi xóa nó, như bạn đã nói, Visual Studio tự động thêm nó. –

+0

@NikhilAgrawal - rằng trình chỉnh sửa VS nhấn mạnh thêm nó (tương tự nó sẽ thêm lại 'ByVal' nếu bạn xóa nó). Nhưng ngôn ngữ Visual Basic * * không yêu cầu những thứ này. –

+0

@NikhilAgrawal Nó không có nghĩa là trình biên dịch cần nó. – sloth

2

Tôi nghĩ, phần cú pháp của nó trong Visual Basic. Bạn có thể bỏ qua kiểu dữ liệu, nếu OptionStrict không bật. Nhưng nếu bạn chỉ định loại, nó phải giống như loại thuộc tính.

From MSDN - Set Statement (Visual Basic)

datatype
buộc nếu Option Strict là Bật. Kiểu dữ liệu của tham số giá trị. Loại dữ liệu được chỉ định phải giống với loại dữ liệu của thuộc tính nơi tuyên bố Set này được khai báo.

2

Bởi vì bạn được phép trong VB để thay đổi tên của tham số:

Public Property MyText() As String 
    Get 
     Return str 
    End Get 
    Set(ByVal val As String) 
     str = val 
    End Set 
End Property 

Bạn không thể thay đổi ByVal-ByRef vì các thông số tài sản duy nhất bao giờ có thể được truyền theo giá trị . Nhưng VB đôi khi ủng hộ nêu rõ sự thật không thể thay đổi được.

Các nhà phát triển có thể (về mặt lý thuyết) đã cho phép bạn chỉ cần có:

Set(val) 

Bởi vì không có gì khác là alterable. Nhưng họ đã chọn tham số để tạo các tham số cho các thuộc tính giống như các tham số cho Function s và Sub s.


Thực tế, bạn không để chỉ định tham số. Theo thông số ngôn ngữ VB (9.7.2):

Nếu danh sách tham số được chỉ định, danh sách tham số phải có một thành viên, thành viên đó không được sửa đổi ngoại trừ ByVal và loại của nó phải giống với loại thuộc tính. Tham số đại diện cho giá trị thuộc tính đang được thiết lập. Nếu tham số được bỏ qua, một tham số có tên Value được ngầm tuyên bố

Và (9.5.2):

Một tham số mà không xác định ByRef hoặc ByVal mặc định là ByVal.

1

Nếu giá trị là ByRef, Setter sẽ có thể thay đổi giá trị của người gọi. Nó không có ý nghĩa để cho phép một setter tài sản gây ra tác dụng phụ như thế này.

0

Bạn có thể có giá trị là một enum và làm một trường hợp chọn trên nó ví dụ và đặt giá trị theo cách đó. Bạn không phải giới hạn cuộc gọi được đặt của thuộc tính để chỉ chuyển cùng một loại giá trị mà là một tính năng tốt đẹp

Các vấn đề liên quan