C# 中 List<T> 的只读冲突? [复制]

Posted

技术标签:

【中文标题】C# 中 List<T> 的只读冲突? [复制]【英文标题】:Read-Only violation on List<T> in C#? [duplicate] 【发布时间】:2019-07-21 05:59:47 【问题描述】:

read only 关键字与 List 结合使用是否违反了??

例如

class Program

    public List<string> InputList;
    public List<string> DefaultList;
    public readonly List<string> ReadOnlyList;

    public Program()
    
        InputList = new List<string>()  "Initialized String" ;
        DefaultList = InputList;
        ReadOnlyList = InputList;
    

    static void Main(string[] args)
    
        var p = new Program();
        p.SampleMethod();
        Console.ReadKey();
    

    private void SampleMethod()
    
        Console.WriteLine("inputList - " + InputList.LastOrDefault());
        Console.WriteLine("readOnlyList - " + ReadOnlyList.LastOrDefault());
        Console.WriteLine("defaultList - " + DefaultList.LastOrDefault());
        InputList.Add("Modified String");
        Console.WriteLine("inputList - " + InputList.LastOrDefault());
        Console.WriteLine("readOnlyList - " + ReadOnlyList.LastOrDefault());
        Console.WriteLine("defaultList - " + DefaultList.LastOrDefault());
    

以及打印出来的输出

inputList - Initialized String

readOnlyList - Initialized String

defaultList - Initialized String

inputList - Modified String

readOnlyList - Modified String

defaultList - Modified String

只读的概念是,如果它没有被初始化,它的值只能在构造函数内部改变。所以在上面的例子中,当两个集合在运行时被改变时,ReadOnlyList 和 DefaultList 之间的确切区别是什么。

我也发现将 ReadOnlyList 更改为 IReadOnlyCollection 并没有什么区别。有人可以帮我理解这个概念吗?

【问题讨论】:

您误解了readonly 关键字的作用 readonly 适用于引用,而不是列表的内容。 “只读的概念是,它的值只能在构造函数内部更改”取决于“值”的含义。没错,您不能重新引用该变量。但是,您当然可以调用该实例上的任何成员,例如Add. 【参考方案1】:

根据documentation:

在字段声明中,readonly 表示对该字段的赋值只能作为声明的一部分或在同一类的构造函数中发生。

你正在做这件事,在构造函数中赋值。

列表本身是readonly,而不是它的内容。

【讨论】:

以上是关于C# 中 List<T> 的只读冲突? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

不变性/只读语义(特别是 C# IReadOnlyCollection<T>)

从 List<OwnStruct> 返回 List<T> 的方法,其中 List<T> 仅包含 List 中所有 OwnStructs 的一个属性(C#)[重复]

C#移除List<T> 指定List<T> 数据项

C#中List<T>的作用与用法,求详解 谢谢

请教C#中的List<T>,筛选list中特定元素的方法

请教C#中的List<T>,删除list中特定元素的方法