假设我有一节课:
class obj
{
int a;
int b;
}
Run Code Online (Sandbox Code Playgroud)
然后我有这个代码:
obj myobj = new obj(){ a=1, b=2}
obj myobj2 = myobj;
Run Code Online (Sandbox Code Playgroud)
现在上面的代码引用了第一个obj.我想要的是myobj2指副本中myobj没有反映在原文中的副本.我搜索了SO,到目前为止解决方案似乎很复杂.有没有更简单的方法来做到这一点.我正在使用.net 4.5
Far*_*yev 84
对象中的属性是值类型,您可以在这样的sutuation中使用浅拷贝:
obj myobj2 = (obj)myobj.MemberwiseClone();
Run Code Online (Sandbox Code Playgroud)
但在其他情况下,如果任何成员是引用类型,则需要Deep Copy.您可以在类的帮助下使用Serialization和Deserialization技术获得对象的深层副本BinaryFormatter:
public static T DeepCopy<T>(T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Context = new StreamingContext(StreamingContextStates.Clone);
formatter.Serialize(ms, other);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
Run Code Online (Sandbox Code Playgroud)
设置的目的StreamingContext:我们可以采取特殊的序列化和反序列化逻辑,我们的代码与一个实现帮助ISerializable界面或使用内置的属性,如OnDeserialized,OnDeserializing,OnSerializing,OnSerialized.在所有情况下,StreamingContext都将作为参数传递给方法(如果是ISerializable接口,则传递给特殊构造函数).设置ContextState为Clone,我们只是提示有关序列化目的的方法.
附加信息:(您也可以从MSDN阅读本文)
浅复制正在创建一个新对象,然后将当前对象的非静态字段复制到新对象.如果字段是值类型,则执行字段的逐位复制; 对于引用类型,引用被复制但引用的对象不是; 因此原始对象及其克隆引用相同的对象.
深层复制正在创建一个新对象,然后将当前对象的非静态字段复制到新对象.如果字段是值类型,则执行字段的逐位复制.如果字段是引用类型,则执行引用对象的新副本.
您可以使用MemberwiseClone
obj myobj2 = (obj)myobj.MemberwiseClone();
Run Code Online (Sandbox Code Playgroud)
副本是浅拷贝,这意味着克隆中的引用属性指向与原始对象相同的值,但这在您的情况下应该不是问题,因为 中的属性obj是值类型。
如果你拥有源代码,你也可以实现ICloneable
| 归档时间: |
|
| 查看次数: |
119960 次 |
| 最近记录: |