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; }
上一篇:无聊的笔记:之二(再来看看到底怎么高性能的使用BeanUtils)


下一篇:MongoDB–Spring Data MongoDB详细的操作手册(增删改查)