一尘不染

在C#中创建对象的副本[重复]

c#

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

public class MyClass 
{
    public int val;
}
public struct myStruct 
{
    public int val;
}
public class Program 
{
    private 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
objectB.val = 20
structA.val = 30
structB.val = 40

输出我有没有问题,但是前两个的最后两行告诉我,objectA并且objectB都指向同一个内存块(因为在C#中,对象是引用类型)。

问题是如何制作make
objectB的副本objectA,使其指向内存中的不同区域。我了解尝试分配其成员可能不起作用,因为这些成员也可能是引用。那么,我该如何与制作objectB完全不同的实体objectA呢?

谢谢


阅读 504

收藏
2020-05-19

共1个答案

一尘不染

没有内置的方式。您可以让MyClass实现该IClonable接口(但是已经过时了),或者只编写自己的Copy /
Clone方法。无论哪种情况,您都必须编写一些代码。

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

无论采用哪种方法,请仔细考虑“副本”的确切含义。它应该走多深,要排除的ID字段等?

2020-05-19