C#中深复制的实现
2018-03-08 15:51
316 查看
浅复制
object对象中以定义了MemberwiseClone()方法来实现浅复制,我们只需调用该方法即可(注意:该方法访问控制为protected)class Program { public static void Main(string[] args) { var classA1 = new ClassA { a = 1, b = "haha", d = new ClassB{ c ="haha" } }; var classA2 = (ClassA)classA1.Clone(); classA2.b = "xixi"; classA2.d.c = "xixi"; Console.WriteLine("classA1.b=" + classA1.b + "\nclassA2.b=" + classA2.b); Console.WriteLine("classA1.d.c=" + classA1.d.c + "\nclassA2.d.c=" + classA2.d.c); } public class ClassA : ICloneable { public int a; public string b; public ClassB d; public object Clone() { return MemberwiseClone(); } } public class ClassB { public string c; } }
输出结果:
classA1.b=haha classA2.b=xixi classA1.d.c=xixi classA2.d.c=xixi
这里有个问题:string也是引用类型,更改使用浅复制的到classA2对象的b的值后,为什么classA1对象的b的值为什么没有跟着变化?
知识点:C#中字符串的值是不可修改的,执行修改字符串的操作时,会重新创建一个新的string对象,然后让变量指向新对象的地址。
深复制
通过序列化实现//只需修改Clone方法的实现,同时使用[Serializable]标记ClassA类和ClassB类为可序列化,其他部分不变 [Serializable] public class ClassA : ICloneable { public int a; public string b; public ClassB d; public object Clone() { using (MemoryStream stream = new MemoryStream(1000)) { BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, this); stream.Seek(0, SeekOrigin.Begin); return formatter.Deserialize(stream); } } } [Serializable] public class ClassB { public string c; }
通过Json实现
using Newtonsoft.Json; public object Clone() { var str = JsonConvert.SerializeObject(this).ToString(); return JsonConvert.DeserializeObject<ClassA>(str); }
相比于序列化,使用Json的方式不用给每个用到的类添加[Serializable]标记(修改原类),且更简洁
相关文章推荐
- VMware Workstation虚拟机Ubuntu中实现与主机共享(复制和粘贴)
- MySQL主从复制--mysql-proxy实现MySQL-5.6读写分离
- 使用JAVA实现比较两个文件夹下的文件新增和修改情况,并复制到新的目录(实现增量更新项目)
- jquery实现table行复制粘贴功能
- 不依赖Flash 实现剪贴板复制
- 通过CLP实现library之间的自动复制 (转)
- JS实现复制/粘贴功能
- 使用Spring实现读写分离( MySQL实现主从复制)
- (四)Linux下c语言用fread()和fwrite()实现文件复制
- 在多台服务器上简单实现Redis的数据主从复制
- android-Java中实现复制文件或文件夹 - 随心
- Mycat+Mysql主从复制实现双机热备
- 用流实现文件的重命名复制到其他文件夹
- 点击按钮自动复制到剪贴板的实现
- mysql主从复制实现SSL加密和半同步复制
- 【原】js实现复制到剪贴板功能,兼容所有浏览器
- 实现一个函数clone,使JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制
- Mongo实现主从复制与集群,使用Replica Sets实现
- [Android] TextView长按复制实现方法小结(转载)
- VMWare -- winscp实现windows主机和Ubuntu虚拟机之间文件复制(通过ftp协议)