按值复制结构的引用类型成员
本文关键字:引用类型 成员 结构 复制 | 更新日期: 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
的对象引用和int
( Int32
) 组成。作业
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
更改为结构。