C#初探深拷贝和浅拷贝

先用一句话简单解释下浅拷贝和深拷贝是什么意思:

好像说不明白,那就两句话吧。

首先不管是深拷贝还是浅拷贝都是针对引用对象(详解:https://www.cnblogs.com/personblog/p/11308831.html

如果是浅拷贝,那么拷贝对象中的引用对象是直接复制的引用对象(是同一个东西);

如果是深拷贝,那么拷贝对象中的引用对象也会复制出新的一份到新对象中。

为什么说是针对引用对象,因为值对象都是直接复制过来的。

直接上代码吧,然后再看看怎么处理浅拷贝的问题;

UserDTO a = new UserDTO() { Name = "Lee", ID = "1" };
UserDTO b = new UserDTO();
b = a;
Console.WriteLine(b.Equals(a));
Console.WriteLine("-----------");
b.Name = "Mac";
Console.WriteLine(a.Name);

其中UserDTO是一个类,只有Name和ID两个字段

输出结果:

True

Mac

说明了a和b就是同一个东西,这就是浅拷贝,究其原因,就是类是引用类型,而不是值类型

那怎么浅拷贝做成深拷贝的效果呢?

有三个方法(参见:https://www.cnblogs.com/TheBob/p/9414014.html):

上代码,这两个方法都可以:

     //方法一    
     public static void DeepCopy<T>(T _raw,T _toObj)where T:class
        {
            Type type = _raw.GetType();
            object o = Activator.CreateInstance(type);
            PropertyInfo[] PI = type.GetProperties();
            for (int i = 0; i < PI.Length; i++)
            {
                PropertyInfo P = PI[i];
                P.SetValue(o, P.GetValue(_raw));
            }
            _toObj = o as T;
            return;
        }
     //方法二
        public static T DeepCopy<T>(T _raw)
        {
            Type type = _raw.GetType();
            object o = Activator.CreateInstance(type);
            PropertyInfo[] PI = type.GetProperties();
            for (int i = 0; i < PI.Length; i++)
            {
                PropertyInfo P = PI[i];
                P.SetValue(o, P.GetValue(_raw));
            }         
            return (T)o;
        }

调用情况:

            UserDTO a = new UserDTO() { Name = "Lee", ID = "1" };
            UserDTO b = new UserDTO();
            b = a;
            Console.WriteLine(b.Equals(a));
            //DeepCopy(a, b);
            b = DeepCopy(a);
            Console.WriteLine("-----------");
            Console.WriteLine(b.Equals(a));
            b.Name = "Mac";
            Console.WriteLine(a.Name);            

输出结果:

 大功告成!

猜你喜欢

转载自www.cnblogs.com/LeeSki/p/12162055.html