是否有一个关键字可以从类外部只读取类变量但不在内部?

时间:2014-07-30 09:21:33

标签: vb.net

基本上,readonly关键字不允许我在第一次创建类实例后修改字段。我可以使用一个属性,但在这种情况下它只是额外的开销。是否有关键字只能从类外部读取一个类字段?

3 个答案:

答案 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

请注意,这是一件非常可怕的事情。反射不应该用于此类事情,因为你将会受到性能影响。只需使用属性并省去麻烦。