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

本文关键字:属性 我应该 vb net ReadOnly | 更新日期: 2023-09-27 18:21:45

I像.NET自动属性一样,在C#中,通过将其set节声明为private来声明readonly属性非常容易,如下所示:

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中的这些声明之间有什么区别,首选哪一个?为什么?

编辑

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

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

ReadOnly的情况下,只有那些能够访问底层变量的人才能通过直接应用这样的更改来更改底层值(例如,同一类中的元素)。在后一种情况下,Private Set(这基本相同)类范围内的元素可以更改基础值,但可以通过属性来更改。

首选哪一个是间接的:属性的一个优点是,与方法一样,在应用更改时可以进行进一步的实现(尽管应该避免副作用,但您可能会"验证"并接受异常)。如果在设置值时总是有其他事情要做,这与设置值密切相关,则可以在该属性setter中执行,而不是在执行set时必须对该实现进行编码。

请注意,如果您使用的是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

第一个块只允许您获得Name的值。不能设置"名称"。

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

Me.Name = "new value"

我会选择选项1,因为第二个选项冗长而没有提供任何实际价值。

第一个属性声明ReadOnly使其成为不可修改的属性。第二个Private Set允许在您使用Me.Name = "str"的类中修改属性。

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