ReadOnly属性获得“无意”更改

时间:2013-12-18 05:58:22

标签: arrays vb.net class oop

我理解列表,数组,对象等类型通过引用“复制”。然而,我的自然和普通意图只是在这个上下文中有一个“副本”,我故意使用ReadOnly而不是Read / Write属性。在下面的示例中,ReadOnly'Extensions'属性通过'm_extensions'引用更改得到更改。无论如何,我认为这种行为是不正确的,我必须做额外的工作来防止ReadOnly属性被覆盖。是否有用于“m_extensions”值保护的内置关键字?

Public Classs A

    ' more properties and methods here...

    Private m_extensions() As String = {"*.abc", "*.def"}
    Public ReadOnly Property Extensions() As String()
        Get
            Return m_extensions
        End Get
    End Property

End Class

Public Classs B

    ' more stuff here...

    Private Function BuildFilter() As String
        Dim l() As String = A.Extensions
        Dim s As String = String.Empty
        For m As Integer = 0 To l.Length - 1
            Select Case l(m).ToLower
                Case "*.*" : s = "All Files"
                Case "*.abc" : s = "ABC File"
                Case "*.def" : s = "DEF File"
                Case Else : s = "XYZ File " + m.ToString
            End Select
            l(m) = String.Format("{1} ({0})|{0}", l(m), s)
        Next
        Return String.Join("|", l)
    End Function

End Class

1 个答案:

答案 0 :(得分:0)

Readonly修饰符表示使用该属性的任何内容都无法更改以这种方式保护的引用(例如,无法将其设置为Nothing)。它不会阻止更改从该属性返回的数组中的值。

绕过它的一种方法可能是复制属性中的数组。这样可以防止修改原始数组:

Public ReadOnly Property Extensions() As String()
    Get
        Return m_extensions.Clone()
    End Get
End Property