zoukankan      html  css  js  c++  java
  • 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);            

    输出结果:

     大功告成!

  • 相关阅读:
    druid + mybatis-spring使用注解方式整合
    druid+dbutils+spring整合web项目
    spring继承注入和自动注入
    spring命名空间注入
    spring入门学习第二篇
    spring入门学习第一篇
    mybatis插入数据返回主键
    北京充电桩数据的获取与展示
    有关“GIS讲堂”升级与更改logo的通知
    一个GISER 6.7的祝福
  • 原文地址:https://www.cnblogs.com/LeeSki/p/12162055.html
Copyright © 2011-2022 走看看