我喜欢.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
中这些声明之间有什么区别,哪一个是首选?为什么?
修改
哪一个会影响编译时间,运行时间或性能?
答案 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