0

我有一个结构和一个类

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!

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

4

2 回答 2

1

MyStructure由一个类型的对象引用MyClass和一个int( Int32) 组成。那作业

MyStructure struct2 = struct1;

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

如果你想复制,你可以说

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

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

(顺便说一句, theMyStructure是一个“可变结构”。很多人不鼓励他们。如果您将字段标记为MyStructureas readonly,我认为“很多人”会感到满意。)

补充:另请参阅对 Can 结构的回答包含对 C# 中引用类型的引用

于 2013-01-22T20:17:48.790 回答
0

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

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

然后使用以下命令调用复制构造函数:

MyStructure struct2 = new MyStructure(struct1);

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

于 2013-01-22T20:00:47.623 回答