【发布时间】:2012-03-13 13:19:19
【问题描述】:
我有一个对象集合,我正在尝试克隆这个集合并尝试了解不同方法的性能影响。
集合中的对象有大约 20 个属性,所有字符串、整数、浮点数(该对象内部没有任何嵌套对象)。这两种方法是:
-
创建 DeepClone() 方法:
public static class ExtensionMethods { public static T DeepClone<T>(this T a) { using (var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(stream, a); stream.Position = 0; return (T)formatter.Deserialize(stream); } }}
-
手动编写“复制”代码,在其中循环遍历集合并“新建”一个新对象,然后手动设置所有 20 个属性。像这样的
public MyObject Copy(MyObject myObj) { var obj = new MyObject(); obj.Prop1 = myObj.Prop1; obj.Prop2 = myObj.Prop2; return obj;}
我得到的结果非常不一致,所以我想得到人们的反馈:
一个应该比另一个快得多吗?我会想到选择二,但我的测试似乎不支持这一点,所以我想弄清楚我是否做错了什么。
有什么方法可以更快地做到这一点?
【问题讨论】:
-
当您只想执行浅拷贝时,我不确定您为什么要标记此 DeepClone()。由于字符串是不可变的,因此字符串的浅拷贝等同于深拷贝。此外,由于 BinaryFormatter 使用反射来获取属性名称、setter、构造函数等,因此手动设置必须快得多。
-
@Gelno - 如果对象内部有嵌套对象,此方法将深度克隆对象(因此得名)
标签: c# performance clone