我有一个场景:
MyClass obj1 = new MyClass();
............//some operations on obj1;
MyClass obj2 = new MyClass();
obj2 = obj1;
我有以下问题:如果我修改任何参数,它会在两个对象中受影响(因为两者都指向同一位置) - 但是,当我修改obj2参数时,它不应该修改obj1中的参数值(即均值两者都不应该指向同一个位置)。我怎样才能做到这一点?请帮我。 我无法在这里克隆,因为myclass没有实现ICloneable,我无法修改myclass。 如果我通过序列化和反序列化克隆,它会是一个深度克隆吗?
答案 0 :(得分:5)
制作MyClass
工具ICloneable并使用
MyClass obj1 = new MyClass();
...
MyClass obj2 = obj1.Clone();
如果MyClass
不可克隆,则需要在obj1中查找所有特征值并将它们复制到obj2,例如
myclass obj2 = new myclass();
obj2.color = obj1.color; // .Clone();
obj2.size = obj1.size;
obj2.numberOfLimbs = obj1.numberOfLimbs;
// etc.
答案 1 :(得分:3)
对象分配要记住的是变量和对象之间的区别。
在您的示例中,obj1
和obj2
是变量。变量可以引用到对象,但它们本身不是对象。
您的代码所做的是,最后告诉obj1
和obj2
引用同一个对象。
你想要做的是创建一个新对象 - 正如其他人指出的那样,它最容易通过ICloneable
界面完成。
答案 2 :(得分:1)
在myClass上有一个扩展方法:GetDeepCopy 手动获取obj的副本并在GetDeepCopy中返回。
类似于:
myclass obj1 = new myclass();
...
myclass obj2 = obj1.etDeepCopy();
答案 3 :(得分:0)
要添加KennyTM的答案,object Clone()
方法会复制调用对象。可以制作两种类型的副本。深拷贝和浅拷贝。在KennyTM的回答中,我做了一个深层复制。在深层复制中,原始对象和复制的对象完全相互独立。有关详细信息,请阅读ICloneable
的文档。
Clone()声明可能是这样的:
public object Clone()
{
Myclass obj=new Myclass();
return obj;
}
答案 4 :(得分:0)
假设对象上的类型很简单,你可以简单地编写一个执行一种MemberwiseClone的函数,例如。
MyClass obj = new MyClass();
// do your thing
MyClass objCopy = new MyClass();
objCopy.IamInt = obj.IamInt;
objCopy.IamString = obj.IamString;
更一般地说,我发现这篇Jon Skeet文章在考虑引用时非常有用。
答案 5 :(得分:0)
KennyTM的建议将是默认选择。但是,由于您无法像在评论中提到的那样修改源代码,因此您可能需要编写大量代码,如果涉及私有成员,可能需要反映。
如果您可以使用开源库,并且如果要克隆的对象的对象图中的所有类型都有默认构造函数,您可以在我的库中查看实用程序:Fasterflect's DeepClone()。该实用程序毫不奇怪地执行深度克隆并处理循环引用;实现由CIL代码生成支持,因此性能不应该比手工制作的反射代码好得多。
答案 6 :(得分:0)
如果MyClass声明了一个拷贝构造函数,你可以做一个
MyClass obj2=new MyClass(obj1).
否则,您应该创建一个要复制的函数,如下所示:
MyClass CopyMyClassObject(MyClass obj1)
{
MyClass Result = new MyClass();
Result.Value1 = obj1.Value1;
Result.Value2 = obj1.Value2;
//...
Result Valuen = obj1.Valuen;
Result.Object1.Value1 = obj1.Object1.Value1;
Result.Object1.Value2 = obj1.Object1.Value2;
//...
Result.Object1.Valuen = obj1.Object1.Valuen;
//..and so on until all values have been assigned
//The actual assignments will use whatever methods are provided in MyClass, of course.
return Result;
}
之后,在您的代码中,您只需执行以下操作:
MyClass obj2 = CopyMyClassObject(obj1);
我希望这会有所帮助。