基本上,readonly关键字不允许我在第一次创建类实例后修改字段。我可以使用一个属性,但在这种情况下它只是额外的开销。是否有关键字只能从类外部读取一个类字段?
答案 0 :(得分:1)
将字段设为私有,为其提供getter和setter。 将setter设为私有。 这样,可以通过getter从类外部看到该值,但是,不能从类外部设置/写入。 这使得该属性在类外部是只读的。
答案 1 :(得分:1)
正如其他人所说,使用财产。如果您不想将该属性拆分为一个Getter
和一个Setter
,请将该setter设为私有。
Public Class Foo
Public Property Abc() As Object
Get
Return Me.m_Abc
End Get
Private Set(value As Object)
Me.m_Abc = value
End Set
End Property
Private m_Abc As Object
End Class
但是:常见的方法是将字段的访问级别设置为Friend
,使其可以在同一个程序集中访问,但不能从程序集外部访问。
Public Class Foo
Public ReadOnly Property Abc() As Object
Get
Return Me.m_Abc
End Get
End Property
Friend m_Abc As Object
End Class
答案 2 :(得分:0)
不,没有。这种类型的场景正是为什么首先提供属性的原因。你获得了很大的灵活性。
但是,如果您坚持要使用只读字段,则可以使用反射来更改值: -
Public Class TestClass
Public ReadOnly MyNumber As Integer
Public Sub New()
'Readonly fields can only be changed this way
'in the constructor
Me.MyNumber = 900
End Sub
Public Sub ChangeNumber(ByVal num As Integer)
SetNumber(num)
End Sub
Private Sub SetNumber(ByVal num As Integer)
Dim fi = Me.GetType.GetField("MyNumber")
'Reflection can change the value of
'a read only field after construction
fi.SetValue(Me, num)
End Sub
End Class
请注意,这是一件非常可怕的事情。反射不应该用于此类事情,因为你将会受到性能影响。只需使用属性并省去麻烦。