This question already has answers here:
How do I create an immutable Class?
                                
                                    (6个答案)
                                
                        
                                6年前关闭。
            
                    
我只是看着IReadOnlyList<T>创建只读列表。但是我认为这不是100%只读的。我无法从列表中添加/删除该项目,但仍可以修改成员。

考虑这个例子。

class Program
{
    static void Main(string[] args)
    {
        List<Test> list = new List<Test>();
        list.Add(new Test() { MyProperty = 10 });
        list.Add(new Test() { MyProperty = 20 });

        IReadOnlyList<Test> myImmutableObj = list.AsReadOnly();

        // I can modify the property which is part of read only list
        myImmutableObj[0].MyProperty = 30;
    }
}

public class Test
{
    public int MyProperty { get; set; }
}


为了使其真正只读,我必须将MyProperty设置为只读。这是一个自定义类,可以修改该类。如果我的列表属于具有getter和setter属性的内置.net类,该怎么办?我认为在那种情况下,我必须编写该.net类的包装,该包装只允许读取该值。

有什么方法可以使现有的类不可变?

最佳答案

一个真正不可变的类是其属性和字段均为只读的类。该定义是递归的,因为该类的字段和属性中包含的所有类也必须是只读的。您的只读列表不是真正不变的,因为列表的内容不是不变的,因为正如您所说的,您可以对其进行修改。为了使IReadOnlyList<T>真正不可变,列表中的各个项目也必须是只读的。

08-19 15:18