如何修改类使List值独立存储,不受外部集合清空影响
解决类中列表被外部修改的问题
你碰到的这个问题其实是C#里引用类型的典型坑——List<T>是引用类型,当你在构造函数里直接把外部的exampleList赋值给类内的temp时,两者指向的是同一个内存地址里的列表实例。所以外部调用exampleList.Clear()时,本质上是在修改那个共享的实例,类里的list自然也跟着空了。
要让类里的列表完全独立于外部传入的列表,你需要做两处关键修改:
1. 构造函数中创建独立的列表实例
不要直接赋值引用,而是基于传入的列表创建一个新的List实例,把原列表的元素复制进去:
class exampleClass { private List<string> temp = new List<string>(); public exampleClass(List<string> list) { // 用传入的列表元素初始化新列表,切断引用关联 temp = new List<string>(list); } // 后续属性修改见下面 }
2. 限制外部对内部列表的修改权限(可选但推荐)
现在虽然构造函数里创建了独立列表,但如果外部通过list属性拿到内部列表的引用,还是能直接修改它。为了彻底封装,你可以把属性返回值改成只读接口:
public IReadOnlyList<string> list { get { return temp.AsReadOnly(); } }
这样外部只能读取列表元素,无法调用Clear()、Add()这类修改方法,进一步保证内部数据的独立性。
修改完成后,再运行你的初始化代码:
public MainWindow() { List<string> exampleList = new List<string>(); exampleList.Add("TEST"); Klasy.exampleClass test = new Klasy.exampleClass(exampleList); exampleList.Clear(); // 现在这个操作只会清空外部的列表,类里的不受影响 InitializeComponent(); }
此时test.list里依然会保留"TEST"这个元素。
内容的提问来源于stack exchange,提问作者marcinboz84
相关产品推荐
相关产品推荐

