允许对象的 List(Of T) 属性 被修改但不被替换
Allow an object's List(Of T) property to be amended but not replaced
如果我创建这样的对象...
Public Class SomeClass
Public Property SomeList As New List(Of Int32)
End Class
...我可以使用常规方法更改列表:
Dim s As New SomeClass()
s.SomeList.Add(123)
但是,是否可以允许上述访问列表,但防止整个列表被另一个列表实例替换?例如,防止这样:
Dim s As New SomeClass()
Dim lst As New List(Of Int32)
lst.Add(1)
s.SomeList = lst ' <-- prevent a replacement list being passed
我注意到在使用 Net.MailMessage
class 时,有一个名为 To
的 属性 似乎已应用。我可以将电子邮件地址添加到列表中...
Dim mm as New MailMessage
mm.To.Add(New MailAddress("me@company.com"))
...但我无法替换 MailAddressCollection
:
Dim mm As MailMessage
Dim mc As MailAddressCollection
mm.To = mc ' Error: Property 'To' is 'ReadOnly'
请问这是如何实现的?我试图反编译 MailMessage 的源代码,但是有很多代码 我正在努力查看它是如何完成的。
有两种方法..
Private _SomeList As New List(Of Int32)
Public ReadOnly Property SomeList As IList(Of Int32)
Get
Return _SomeList
End Get
End Property
..正如康拉德在评论中指出的那样。使用 属性 return IList 接口而不是 List 是一种风格。如果您 运行 代码分析,它会建议 return 使用 IList 而不是 List。
这将阻止调用者用一个全新的列表替换列表或将其设置为 Nothing,但是没有什么可以阻止他们做类似...
someInstance.SomeList.Clear()
someInstance.SomeList.AddRange(newListOfStuff)
如果你真的想限制调用者可以用它做什么,你可以将列表保留为私有,只实现让调用者做你想让他们做的事情的方法...
Private _SomeList As New List(Of Int32)
Public Sub AddToSomeList(val As Int32)
_SomeList.Add(val)
End Sub
现在来电者可以添加到列表但不能删除或清除列表。
如果我创建这样的对象...
Public Class SomeClass
Public Property SomeList As New List(Of Int32)
End Class
...我可以使用常规方法更改列表:
Dim s As New SomeClass()
s.SomeList.Add(123)
但是,是否可以允许上述访问列表,但防止整个列表被另一个列表实例替换?例如,防止这样:
Dim s As New SomeClass()
Dim lst As New List(Of Int32)
lst.Add(1)
s.SomeList = lst ' <-- prevent a replacement list being passed
我注意到在使用 Net.MailMessage
class 时,有一个名为 To
的 属性 似乎已应用。我可以将电子邮件地址添加到列表中...
Dim mm as New MailMessage
mm.To.Add(New MailAddress("me@company.com"))
...但我无法替换 MailAddressCollection
:
Dim mm As MailMessage
Dim mc As MailAddressCollection
mm.To = mc ' Error: Property 'To' is 'ReadOnly'
请问这是如何实现的?我试图反编译 MailMessage 的源代码,但是有很多代码 我正在努力查看它是如何完成的。
有两种方法..
Private _SomeList As New List(Of Int32)
Public ReadOnly Property SomeList As IList(Of Int32)
Get
Return _SomeList
End Get
End Property
..正如康拉德在评论中指出的那样。使用 属性 return IList 接口而不是 List 是一种风格。如果您 运行 代码分析,它会建议 return 使用 IList 而不是 List。
这将阻止调用者用一个全新的列表替换列表或将其设置为 Nothing,但是没有什么可以阻止他们做类似...
someInstance.SomeList.Clear()
someInstance.SomeList.AddRange(newListOfStuff)
如果你真的想限制调用者可以用它做什么,你可以将列表保留为私有,只实现让调用者做你想让他们做的事情的方法...
Private _SomeList As New List(Of Int32)
Public Sub AddToSomeList(val As Int32)
_SomeList.Add(val)
End Sub
现在来电者可以添加到列表但不能删除或清除列表。