我理解列表,数组,对象等类型通过引用“复制”。然而,我的自然和普通意图只是在这个上下文中有一个“副本”,我故意使用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
答案 0 :(得分:0)
Readonly
修饰符表示使用该属性的任何内容都无法更改以这种方式保护的引用(例如,无法将其设置为Nothing)。它不会阻止更改从该属性返回的数组中的值。
绕过它的一种方法可能是复制属性中的数组。这样可以防止修改原始数组:
Public ReadOnly Property Extensions() As String()
Get
Return m_extensions.Clone()
End Get
End Property