C# 对象分配

C# 对象分配,c#,C#,我有这样一个场景: MyClass obj1 = new MyClass(); ............//some operations on obj1; MyClass obj2 = new MyClass(); obj2 = obj1; 我有以下问题:如果我修改任何参数,它在两个对象中都会受到影响(因为两者都指向同一位置)-但是,当我修改obj2参数时,它不应该修改obj1中的该参数值(即意味着两者不应该指向同一位置)。我该怎么做?请帮帮我。 我不能在这里克隆,因为myclass没有实现

我有这样一个场景:

MyClass obj1 = new MyClass();
............//some operations on obj1;
MyClass obj2 = new MyClass();
obj2 = obj1;
我有以下问题:如果我修改任何参数,它在两个对象中都会受到影响(因为两者都指向同一位置)-但是,当我修改obj2参数时,它不应该修改obj1中的该参数值(即意味着两者不应该指向同一位置)。我该怎么做?请帮帮我。 我不能在这里克隆,因为myclass没有实现ICloneable,我不能修改myclass。
如果我通过序列化和反序列化进行克隆,它会是深度克隆吗?

让您的
MyClass
实现并使用

如果
MyClass
不可关闭,则需要在obj1中查找所有特征值并将其复制到obj2,例如

myclass obj2 = new myclass();
obj2.color = obj1.color; // .Clone();
obj2.size = obj1.size;
obj2.numberOfLimbs = obj1.numberOfLimbs;
// etc.

为了补充KennyTM的答案,
objectclone()
方法复制调用对象。有两种类型的副本可以制作。深拷贝和浅拷贝。在肯尼特的回答中,制作了一份深度拷贝。在深度复制中,原始对象和复制对象彼此完全独立。有关更多信息,请阅读的文档

Clone()声明可以是这样的:

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

对象赋值要记住的是变量和对象之间的区别

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

代码所做的是,在最后告诉
obj1
obj2
引用同一对象


您要做的是创建一个新对象,正如其他人所指出的,这是通过
ICloneable
接口最容易实现的。

在myClass上有一个扩展方法:GetDeepCopy 手动获取并复制obj,并将其返回到GetDeepCopy中

比如:

myclass obj1 = new myclass();

...

myclass obj2 = obj1.etDeepCopy();

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

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

更一般地说,我发现这篇文章在考虑引用时非常有用。

肯尼特的建议将是默认选择。但是,由于您不能像在注释中提到的那样修改源代码,因此可能需要编写大量代码,如果涉及到私有成员,则可能需要编写反射代码


如果可以使用开源库,并且要克隆对象的对象图中的所有类型都具有默认构造函数,则可以签出“我的库”中的实用程序:。毫不奇怪,该实用程序执行深度克隆并处理循环引用;该实现是由CIL代码生成支持的,因此没有比手工制作的反射代码更好的性能了

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

我希望这能有所帮助。

这里MYClass没有实现ICloneable,我无法修改该类。除了Clone(),还有其他选择吗?@sandhya,在这种情况下,我认为一个复制构造函数可能会有所帮助。但不管怎样,您都需要访问Myclass。@sandhya,这可能会有所帮助:
Myclass
的接口是什么?Myclass只是实现了ISerializable。。是的,这将是一个非常低效的深度克隆。实际上Myclass有子对象(还有子对象)。我想在不影响obj1的情况下修改obj2中的子对象参数。您能给我一些线索吗
MyClass obj2 = CopyMyClassObject(obj1);