c# - 在 C# 中创建结构的浅拷贝

标签 c# .net 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
    }

最佳答案

您对深拷贝与浅拷贝的作用的预期是不正确的。 浅拷贝复制所有值类型,只复制引用类型的引用。 深拷贝复制所有值类型和所有引用类型。

因此您的结构在执行以下操作时已经执行了浅拷贝:

MyStruct struct2 = struct1;

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

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;
}

关于c# - 在 C# 中创建结构的浅拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18012911/

相关文章:

.net - 线程是否可以在临界区中间被抢占?

c# - 克隆任意对象的函数

c# - 客户端服务器身份验证

C# ? : Expression

c# - 如何在 C# 中创建包含多种尺寸/图像的图标文件

java - 如何发送列表的值而不是引用(其中列表是 map 的值)?

rust - 无法克隆 Vec<Box<Trait>> 因为无法将 Trait 制成对象

c# - 如何支持用户名unicode?

c# - 通过 OleDbConnection 获取单个记录的最佳方法是什么?

c# - 使用 int 作为除数时计算公式的最佳方法是什么