在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
输出的最后两行我没有问题,但前两个告诉我, objectA
和objectB
指向相同的内存块(因为在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”。