C#一个集合引用另一个集合导致一起改变(深度拷贝)

Posted 沧海·

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#一个集合引用另一个集合导致一起改变(深度拷贝)相关的知识,希望对你有一定的参考价值。

昨天在写代码的时候第一次遇到深度拷贝的问题具体是这样
list a= new list();
a= ***

list b=new list();
b=a;

a再次赋值的时候会发生b也跟着一起改变的情况
这是因为
当他指向堆的时候 obj1只是相当于一个门牌号了,引用的集合发生变化他所指向的地址也跟着变了。于是我做了如下的改造

首先你要保证你的实体类是可以被序列化的,加上这个特性标签
我通过 利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
我们对集合的赋值进行深度拷贝


      public static T Clone<T>(T RealObject)
        
            using (Stream objStream = new MemoryStream())
            
                //利用 System.Runtime.Serialization序列化与反序列化完成引用对象的复制
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objStream, RealObject);
                objStream.Seek(0, SeekOrigin.Begin);
                return (T)formatter.Deserialize(objStream);
            

        
  List<a> a= new List<a>();
    a= Clone<List<a>>(b); 

这时候 当b的值在发生改变的时候a的值就不会随着b一起改变了。
因为我们进行了深度拷贝。

以上是关于C#一个集合引用另一个集合导致一起改变(深度拷贝)的主要内容,如果未能解决你的问题,请参考以下文章

C# 中对同步集合的非锁定访问行为

python基础知识0-4

js 将一个集合中相同的数据合到一起存入另一个集合中

c#如何把一list<> 复制到 另一个list<>

一个list集合数据拷贝到另一个集合中

python变量引用拷贝之间的关系