我应该在vb.net中使用只读属性还是带有私有设置的属性?

11

我喜欢.NET自动属性,在C#中声明readonly属性非常简单,只需将其set部分声明为private即可,如下所示:

public String Name{ get; private set; }

但是当我在VB.NET中尝试这样做时,我很惊讶地发现它不被支持,正如这里所提到的,我必须按以下方式编写:

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个回答

6
ReadOnly的情况下,只有访问底层变量的人才能直接更改底层值(例如,同一类中的元素)。在后一种情况下,Private Set是相同的,类内部的元素可以更改底层值,但是可以通过属性来实现。
哪个更受欢迎取决于具体情况:属性的一个优点是,您可以像方法一样,在应用更改时涉及进一步的实现(尽管应避免副作用,例如,您可能会“验证”并引发异常)。如果在设置值时总是有其他事情要做,与设置值密切相关,那么您可以在此属性设置器中执行它,而不必在每次进行set时编写该实现。

2
请注意,如果您正在使用Roslyn编译器(.NET 4.6及更高版本,VS.NET 2015+),即使使用了简短的VB.NET形式,也是如此。
Public ReadOnly Property Name as String

即使没有私有变量,类的构造函数仍然可以为只读属性赋值。甚至可以将该属性作为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 of this class


1

第一个代码块只允许您获取Name的值,无法设置Name。

第二个代码块允许您从类内部设置Name的值。例如:

Me.Name = "new value"

我会选择选项1,因为第二个选项啰嗦而没有提供任何真正的价值。

1

第一个属性声明 ReadOnly 使得该属性无法被修改。第二个 Private Set 允许在你正在工作的类中修改该属性 Me.Name = "str"

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接