对象分配

我有一个场景,如:

MyClass obj1 = new MyClass(); ............//some operations on obj1; MyClass obj2 = new MyClass(); obj2 = obj1; 

我有以下问题:如果我修改任何参数,它在两个对象中都会受到影响(因为它们都指向相同的位置) – 但是,当我修改obj2参数时,它不应该修改obj1中的参数值(即意味着两者都不应该指向同一地点)。 我怎样才能做到这一点? 请帮我。 我不能在这里克隆,因为myclass没有实现ICloneable,我无法修改myclass。 如果我通过序列化和反序列化克隆,它会是一个深度克隆吗?

使您的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. 

对象分配要记住的是变量和对象之间的区别。

在您的示例中, obj1obj2是变量。 变量可以引用对象,但它们本身不是对象。

你的代码所做的是,最后告诉obj1obj2引用同一个对象。

你想要做的是创建一个新对象 – 正如其他人指出的那样,它最容易通过ICloneable接口完成。

在myClass上有一个扩展方法:GetDeepCopy手动获取obj的副本并在GetDeepCopy中返回它。

所以类似于:
myclass obj1 = new myclass();
...
myclass obj2 = obj1.etDeepCopy();

要添加KennyTM的答案, object Clone()方法会生成调用对象的副本。 可以制作两种类型的副本。 深拷贝和浅拷贝。 在KennyTM的回答中,我做了一个深层复制。 在深层复制中,原始对象和复制的对象完全相互独立。 有关更多信息,请阅读ICloneable的文档。

而Clone()声明可能是这样的:

 public object Clone() { Myclass obj=new Myclass(); return obj; } 

假设对象上的类型很简单,你可以简单地编写一个执行一种MemberwiseClone的函数,例如

 MyClass obj = new MyClass(); // do your thing MyClass objCopy = new MyClass(); objCopy.IamInt = obj.IamInt; objCopy.IamString = obj.IamString; 

更常见的是,我发现这篇Jon Skeet文章在考虑引用时非常有用。

KennyTM的建议将是默认选择。 但是,由于您无法像在评论中提到的那样修改源代码,因此您可能需要编写大量代码,如果涉及私有成员,则可能需要反映。

如果您可以使用开源库,并且如果要克隆的对象的对象图中的所有类型都具有默认构造函数,则可以在我的库中检出实用程序: Fasterflect的DeepClone() 。 该实用程序毫不奇怪地执行深度克隆并处理循环引用; 该实现由CIL代码生成支持,因此性能不应该比手工制作的reflection代码好得多。

如果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); 

我希望这有帮助。