按值复制结构的ref-type成员

时间:2013-01-22 19:28:41

标签: c# value-type reference-type

我有一个结构和一个类

public class MyClass
{
    public string name;
}

public struct MyStructure
{
    public MyClass classValue;
    public int intValue;
    public MyStructure(MyClass classValue, int intValue)
    {
        this.classValue = classValue;
        this.intValue = intValue;
    }
}

在其他地方,我编写以下代码:

MyClass class1 = new MyClass() { name = "AA" };
MyStructure struct1 = new MyStructure(class1, 4);
MyStructure struct2 = struct1;
struct1.classValue.name = "BB";  //struct2.classValue.name also change!

如何在这种情况下确保按值复制结构的每个引用类型成员?

2 个答案:

答案 0 :(得分:1)

您的MyStructure包含MyClass类型的对象引用和intInt32)。作业

MyStructure struct2 = struct1;

只复制那些数据,引用和整数。没有创建MyClass的新实例。你无法改变它。

如果你想复制,你可以说

MyStructure struct2 = new MyStructure(
    new MyClass { name = struct1.classValue, },
    struct1.intValue
    );

当然,如果你需要做很多事情,你可以写一个Clone()方法来做这件事。但是你必须记住使用Clone方法,而不仅仅是分配。

(顺便说一下,MyStructure是一个“可变结构”。很多人都不鼓励它们。如果你将MyStructure的字段标记为readonly,我认为“很多人”会满意的。)

添加:另请参阅Answer to Can structs contain references to reference types in C#

答案 1 :(得分:0)

赋值运算符不会深层复制结构中的引用类型字段。您可以创建自己的复制构造函数,以手动执行深层复制:

public MyStructure(MyStructure structure)
{
    classValue = new MyClass() { name = structure.classValue.name };
    intValue = structure.intValue;
}

然后使用:

调用复制构造函数
MyStructure struct2 = new MyStructure(struct1);

或者,您可以将MyClass更改为结构。