ReadOnly我应该在vb.net中使用私有集的属性或属性?

时间:2012-01-26 16:39:51

标签: c# .net vb.net properties

我喜欢.NET自动属性,在C#中通过将readonly部分声明为set这样来轻松声明private属性:

public String Name{ get; private set; }

但是当我在VB.NET中尝试过这种情况时,我感到震惊的是它不像here那样受到支持,我必须按如下方式编写它:

Private _Name as String
Public ReadOnly Property Name as String
   Get
      return _Name
   End Get
End Property

或者:

Private _Name as String
Public Property Name as String
   Get
      return _Name
   End Get
   Private Set(value as String)
      _Name = value
   End Set
End Property

VB.NET中这些声明之间有什么区别,哪一个是首选?为什么?

修改

哪一个会影响编译时间,运行时间或性能?

4 个答案:

答案 0 :(得分:6)

ReadOnly的情况下,只有那些有权访问基础变量的人才可以通过直接应用这种变化来改变基础价值(例如,同一类中的元素)。在后一种情况下,Private Set - 这大致相同 - 类范围内的元素可以更改基础值,但可以通过属性来实现。

首选哪一个是间接的:属性的一个优点是,您可以像方法一样,在应用更改时涉及进一步的实现(尽管应该避免副作用,您可以'验证'并采取例外,实例)。如果在设置值时总是要做其他事情,那么这与设置值密切相关,您可以在此属性设置器中执行此操作,而不必在任何位置对该实现进行编码。 set

答案 1 :(得分:1)

第一个块只允许您获取Name的值。你不能设置姓名。

第二个块允许您在类中设置Name的值。例如:

Me.Name = "new value"

我会选择选项1,因为第二个选项详细而不提供任何实际值。

答案 2 :(得分:0)

第一个属性声明ReadOnly使得属性无法完全修改。第二个Private Set允许在Me.Name = "str"中使用的类中修改属性。

在这两种情况下,仍然可以使用_Name = "str"在类中更改基础值。

答案 3 :(得分:0)

请注意,如果您使用的是Roslyn编译器(.NET 4.6和更高版本,VS.NET 2015+),那么即使使用简短的VB.NET表单,

Public ReadOnly Property Name as String

没有私有变量,仍然允许类的构造函数将值分配给readonly属性。您甚至可以将属性作为ByRef参数传递给其他函数。

Public Class SomeClass
    Public ReadOnly Property Name1 As String
    Public ReadOnly Property Name2 As String
    Public Sub New()
        PrivSub(Name1)
        Name2 = Name1 & " is now"
    End Sub
    Private Sub PrivSub(ByRef n As String)
        n = System.DateTime.UtcNow.ToLongDateString()
    End Sub
End Class

此类的DotNetFiddle