Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 允许一个对象';s(T)财产清单待修订但未替换_Vb.net - Fatal编程技术网

Vb.net 允许一个对象';s(T)财产清单待修订但未替换

Vb.net 允许一个对象';s(T)财产清单待修订但未替换,vb.net,Vb.net,如果我创建一个像这样的对象 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 Li

如果我创建一个像这样的对象

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
…但我无法替换
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
正如康拉德在评论中指出的那样。让属性返回IList接口而不是列表是一种风格。如果运行代码分析,它将建议返回IList而不是列表

这将阻止调用者用一个全新的列表替换列表或将其设置为“无”,但没有什么可以阻止他们执行类似于

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

现在,调用者可以添加到列表中,但不能删除或清除列表。

将属性设置为只读。。也就是说,不管怎样,公开这样一个完整的列表通常是个坏主意。最好将需要支持的操作准确地放入API中。我发现当应用了
ReadOnly
时,我无法使用快捷方式属性。因此,我假设
Add
实际上是内部/私有财产的属性?是的。消费代码可以访问内部列表,并可以添加、排序、清除。另请参见:@EvilDr即使使用单行“快捷方式”属性,仍然有一个隐藏的私有字段包含该列表。ReadOnly意味着私有字段不能替换为新列表(这是您想要的),它不会阻止属性Get子句的调用方执行列表公开的方法(如Add方法)。@EvilDr因为Microsoft显然不想在进一步开发VB方面投入太多精力。这一趋势多年来一直被观察到,新特性被半途而废,而且,与C#相比,它们的功能几乎总是被削弱(有一些反例,但并不多)。作为一个从VB成长起来的人,自从第一个非官方的测试版开始就使用VB.NET,我建议你放弃VB,转而使用C#——微软显然也这么做了。
Private _SomeList As New List(Of Int32)
Public Sub AddToSomeList(val As Int32)
    _SomeList.Add(val)
End Sub