在C#中创build一个对象的副本

可能重复:
你如何做一个深层复制的对象。NET(具体的C#)?

请看下面的代码(摘自C#书):

namespace Example { class MyClass { public int val; } struct myStruct { public int val; } class Program { static void Main(string[] args) { MyClass objectA = new MyClass(); MyClass objectB = objectA; objectA.val = 10; objectB.val = 20; myStruct structA = new myStruct(); myStruct structB = structA; structA.val = 30; structB.val = 40; Console.WriteLine("objectA.val = {0}", objectA.val); Console.WriteLine("objectB.val = {0}", objectB.val); Console.WriteLine("structA.val = {0}", structA.val); Console.WriteLine("structB.val = {0}", structB.val); Console.ReadKey(); } } } 

我明白它产生下面的输出

 objectA.val = 20 objectA.val = 20 structB.val = 30 structB.val = 40 

输出的最后两行我没有问题,但前两个告诉我, objectAobjectB指向相同的内存块(因为在C#中,对象是引用types)。

问题是如何使objectB成为objectB一个副本,以便它指向内存中的不同区域。 我明白,试图指派他们的成员可能无法工作,因为这些成员也可能是参考。 那么如何让objectB成为与objectA完全不同的实体呢?

谢谢

没有内置的方法。 你可以让MyClass实现IClonable接口(但是这是不赞成使用的),或者只是编写你自己的Copy / Clone方法。 无论哪种情况,您都必须编写一些代码。

对于大对象,你可以考虑序列化+反序列化(通过一个MemoryStream),只是为了重用现有的代码。

不pipe怎样,仔细想想“副本”究竟意味着什么。 应该有多深,是否有Id字段等例外

你可以这样做:

 class myClass : ICloneable { public String test; public object Clone() { return this.MemberwiseClone(); } } 

那么你可以做

 myClass a = new myClass(); myClass b = (myClass)a.Clone(); 

最简单的方法是在MyClass类中写一个拷贝构造函数。

像这样的东西:

 namespace Example { class MyClass { public int val; public MyClass() { } public MyClass(MyClass other) { val = other.val; } } } 

第二个构造函数只接受他自己types的参数(要复制的参数),并创build一个赋予相同值的新对象

 class Program { static void Main(string[] args) { MyClass objectA = new MyClass(); MyClass objectB = new MyClass(objectA); objectA.val = 10; objectB.val = 20; Console.WriteLine("objectA.val = {0}", objectA.val); Console.WriteLine("objectB.val = {0}", objectB.val); Console.ReadKey(); } } 

输出:

 objectA.val = 10 objectB.val = 20 

已经有一个关于这个问题的问题,你可以阅读它

深入克隆对象

在Java中没有Clone()方法,但是你可以在你的clases中包含一个拷贝构造函数,这是另一个好办法。

 class A { private int attr public int Attr { get { return attr; } set { attr = value } } public A() { } public A(A p) { this.attr = p.Attr; } } 

这将是一个示例,在构build新对象时复制成员“Attr”。