You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

标记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.Immutable NuGet包):比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 21:17:10