标记ReadOnly的嵌套List能否修改?ReadOnlyCollection是否为最优替代?
问题解答
1. 该列表及其内容是否可被修改?
是,完全可以被修改。
Public Shared ReadOnly仅限制CONST_PARAMS这个变量本身不能被重新赋值(比如不能执行CONST_PARAMS = New List(Of List(Of Double))()这类操作),但它指向的List(Of List(Of Double))本身是可变集合:
- 外层列表:外部代码可调用
Add、Remove、Clear等方法修改元素数量,示例:CONST_PARAMS.Add(New List(Of Double) From {50.0, 943, 42, 3.1415}) - 内层子列表:每个
List(Of Double)同样是可变集合,外部代码可直接修改元素值,示例:CONST_PARAMS(0)(1) = 1000.0 ' 修改第一个子列表的第二个元素
2. ReadOnlyCollection是否为最优替代方案?
不是,ReadOnlyCollection仅能让外层列表不可变(禁止Add/Remove等操作),但内层的List(Of Double)依然是可变的,外部代码仍能修改子列表中的元素值。
如果要实现完全不可变的嵌套集合,更合适的方案有两种:
- 嵌套使用
ReadOnlyCollection:将每个内层子列表也包装为ReadOnlyCollection(Of Double),外层用ReadOnlyCollection(ReadOnlyCollection(Of Double)),示例代码:Public Shared ReadOnly CONST_PARAMS As ReadOnlyCollection(Of ReadOnlyCollection(Of Double)) = New ReadOnlyCollection(Of ReadOnlyCollection(Of Double))({ New ReadOnlyCollection(Of Double)(New List(Of Double) From {200.0, 913, 42, 3.1415}), New ReadOnlyCollection(Of Double)(New List(Of Double) From {150.0, 923, 42, 3.1415}), New ReadOnlyCollection(Of Double)(New List(Of Double) From {100.0, 933, 42, 3.1415}) }) - 使用.NET不可变集合(需引用
System.Collections.ImmutableNuGet包):比如ImmutableList(Of ImmutableList(Of Double)),从根到叶子都是完全不可变的,修改操作会返回新集合实例,原集合保持不变,示例代码:Public Shared ReadOnly CONST_PARAMS As ImmutableList(Of ImmutableList(Of Double)) = ImmutableList.Create( ImmutableList.Create(200.0, 913, 42, 3.1415), ImmutableList.Create(150.0, 923, 42, 3.1415), ImmutableList.Create(100.0, 933, 42, 3.1415) )
内容的提问来源于stack exchange,提问作者CTZStef
相关产品推荐
相关产品推荐

