为何List构造函数无法生成List<T>的深拷贝?
为什么修改List拷贝集合的元素会影响原集合?
核心原因:List的构造函数执行的是浅拷贝
在C#中,自定义类(比如示例里的Book)属于引用类型。这类类型的实例数据存储在托管堆中,而集合里的元素变量(比如books_1[0])实际存储的是指向堆中对象的引用地址。
当你用new List<Book>(books_1)创建新集合时,这个操作只会:
- 创建一个全新的List容器对象
- 将原List中每个元素的引用地址复制到新List里
也就是说,books_1[0]和books_2[0]指向的是托管堆里同一个Book对象。
对应你的代码场景
当你执行books_2[0].title = "Five"时,代码逻辑是:
- 通过
books_2[0]拿到堆中Book对象的引用地址 - 找到该地址对应的Book对象,修改它的
title属性值 - 由于
books_1[0]也指向同一个Book对象,所以访问books_1[0].title时,看到的就是修改后的值
如果想要让两个集合完全独立,需要实现深拷贝:不仅复制List容器,还要为每个元素创建全新的对象实例,让新List的元素指向这些新对象。
内容的提问来源于stack exchange,提问作者Tomi Tsolov
相关产品推荐
相关产品推荐

