对象分配

时间:2010-03-21 07:08:52

标签: c#

我有一个场景:

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

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

7 个答案:

答案 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)

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

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

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

你想要做的是创建一个新对象 - 正如其他人指出的那样,它最容易通过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);

我希望这会有所帮助。