如何解决在 C# 中创建对象的副本
没有内置的方法。您可以让 MyClass 实现该IClonable
接口(但它已被弃用)或者只是编写您自己的 Copy/Clone
方法。无论哪种情况,您都必须编写一些代码。
对于大对象,您可以考虑序列化 + 反序列化(通过 MemoryStream),只是为了重用现有代码。
无论采用何种方法,请仔细考虑“副本”的确切含义。它应该走多远,是否有要排除的 Id 字段等。
解决方法
请看下面的代码(摘自一本 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# 中,对象是引用类型)。
问题是如何制作objectB
一个副本objectA
,使其指向内存中的不同区域。我知道尝试分配他们的成员可能不起作用,因为这些成员也可能是参考。那么我该如何去制作objectB
一个完全不同的实体objectA
呢?