在C#中创建浅层结构副本

sam*_*mar 1 .net c# clone deep-copy shallow-copy

我试图搜索我的答案并发现它们与C而不是C#所以想到发布它.

我的问题可能在这里微不足道.

根据我的理解(简单来说)

复制完成后

浅复制 - >主对象和复制对象(引用或值类型)应指向内存中的同一对象

DeepCopy - >主对象和复制对象(引用或值类型)应指向内存中的不同对象

继续这一点,我在C#中有一个结构,并尝试制作相同的浅层副本.我尝试使用"MemberwiseClone"方法,但我想它只适用于引用类型.对于值类型,我认为"MemberwiseClone"方法会将其装入对象并将其拆箱到堆栈中的不同内存地址.

我试过的如下.

我的问题是如何(如果可能的话)我可以创建一个简单结构的浅表副本?

我希望我的基本原理在这里是正确的,而不是说垃圾.如果我在任何陈述中出错,请纠正我.

问候,

萨马

struct MyStruct : ICloneable
{
    public int MyProperty { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();//boxing into object
    }
}


    private void btnChkStr_Click(object sender, EventArgs e)
    {
        MyStruct struct1 = new MyStruct();
        struct1.MyProperty = 1;

        //MyStruct struct2 = struct1; //This will create a deep copy
        MyStruct struct2 = (MyStruct)(struct1.Clone());//unboxing into structure hence allocating a different memory address
        struct2.MyProperty = 2;

        MessageBox.Show(struct1.MyProperty.ToString()); //still showing 1
    }
Run Code Online (Sandbox Code Playgroud)

Kai*_*ann 5

您对深拷贝与浅拷贝所做的事情的期望是不正确的.浅拷贝复制所有值类型,只复制引用类型的引用.深拷贝会复制所有值类型和所有引用类型.

因此,在执行以下操作时,您的结构体已执行浅表

MyStruct struct2 = struct1;
Run Code Online (Sandbox Code Playgroud)

此代码示例(控制台应用程序)显示,更改第二个结构中对象的值也会更改第一个结构中对象的值,因为该对象刚刚被引用复制:

class Program
{
    static void Main(string[] args)
    {
        Test t1 = new Test();
        t1.i = 1;
        t1.o = new Klasse();
        t1.o.i = 1;

        Test t2 = t1;
        t2.i = 2;
        t2.o.i = 2;

        Console.WriteLine(t1.i.ToString());
        Console.WriteLine(t1.o.i.ToString());
        Console.WriteLine(t2.i.ToString());
        Console.WriteLine(t2.o.i.ToString());
        Console.Read();
    }
}

struct Test
{
    public int i;
    public Klasse o;
}

class Klasse
{
    public int i = 0;
}
Run Code Online (Sandbox Code Playgroud)