按值复制结构的引用类型成员

本文关键字:引用类型 成员 结构 复制 | 更新日期: 2023-09-27 17:55:35

我有一个结构和一个类

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!
在这种情况下

,如何确保按值复制结构的每个引用类型成员?

按值复制结构的引用类型成员

您的MyStructure由类型 MyClass 的对象引用和intInt32 ) 组成。作业

MyStructure struct2 = struct1;

仅复制这些数据、引用和整数。不会创建MyClass的新实例。你无法改变这一点。

如果你想复制,你可以说

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

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

(顺便说一下,MyStructure是一个"可变结构"。许多人劝阻他们。如果你把MyStructure的字段标记为readonly,我想"很多人"会满意。

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

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

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

然后使用以下方法调用复制构造函数:

MyStructure struct2 = new MyStructure(struct1);

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