为什么我不能拥有自动实现的只读属性

4

这是被允许的:

Public Property Text() As String

对于只读属性,为什么我不能有一个相当的等价物呢?

Public ReadOnly Property Text() As String

我似乎被迫使用:

Public ReadOnly Property Text() As String
    Get
        Return fText
    End Get
End Property

2
相比之下,在C#中,您可以使用public string Text { get; private set;},这将对其他类型只读,并且在当前类型内是可读写的。 - Marc Gravell
@MarcGravell 技术上讲,那不是只读属性,而是具有私有 setter 的属性。与之对比的是,例如一个只有 getter 和只读后备字段的属性。从优化器的角度来看,它们是不同的。 - Rune FS
1
@RuneFS 哦,我很清楚这一点;但我的陈述仍然有效:对于其他类型,它作为只读(没有公共设置器)操作。 - Marc Gravell
@MarcGravell,我从未怀疑过您的意识 :) 但是我认为您的评论有些误导。另一种类型可以设置任一值,因此在这方面它们是相同的,但是从代码生成/优化的角度来看,它们是_不同的。一个正在访问读写属性,而另一个则不是。只有某些代码可以更改该值的事实并不改变自上次读取以来可能已经发生的事实。 - Rune FS
@RuneFS 只读是一个重载的概念。如果我指的是像字段那样的readonly 关键字,我会将readonly进行风格化处理。而且从技术上讲,即使是readonly也不能完全保证值没有改变(如果你尝试,所有事情都有可能发生)。 - Marc Gravell
@MarcGravell 哦,是的,即使这个可以为null (https://dev59.com/PXE95IYBdhLWcg3wE56C#6864042) - Rune FS
1个回答

5

现在VB14(Visual Studio 2015及更高版本)支持它。自动实现属性可以使用初始化表达式进行初始化:

Public ReadOnly Property Text1 As String = "SomeText"
Public ReadOnly Property Text2 As String = InitializeMyText()

或者在构造函数中:

Public ReadOnly Property Text As String

Public Sub New(text As String)
    Me.Text = text
End Sub

详情:


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