c# - 在 C# 中创建对象的副本

标签 c# object reference cloning

<分区>

请看下面的代码(摘自一本 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

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

问题是如何使 objectB 成为 objectA 的副本,以便它指向内存中的不同区域。我知道尝试分配他们的成员可能行不通,因为这些成员也可能是推荐人。那么,我该如何着手使 objectB 成为与 objectA 完全不同的实体呢?

最佳答案

你可以这样做:

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

那么你可以做

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

注意MemberwiseClone() 创建当前 System.Object 的浅拷贝。

关于c# - 在 C# 中创建对象的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6569486/

相关文章:

c# - 未序列化的结构列表列表。 System.RuntimeType 由于其保护级别而无法访问。只能处理公共(public)类型

c# - 如何在给定点的情况下生成热图

javascript - 对对象数组中的值执行 .join

javascript - 通过引用传递数组不起作用

c++ - 使用函数指针和引用推导模板参数

c# - 最小起订量问题 - 仅在构建服务器 (TeamCity) 上

Java - 如何对这个 ArrayList 进行排序?

javascript - 找到对象中最高值的键,然后将其发布到innerHTML

c++ - 使用不同功能的队列中的打印元素不会在_start程序中全局清空队列。还有更多解释吗?

c# - 当调用程序集是 .NET Framework 4.7.2 时,.NET Standard 库将目标预处理器设置为 NETSTANDARD2_0?