我有一个结构和一个类
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!
如何在这种情况下确保按值复制结构的每个引用类型成员?
答案 0 :(得分:1)
您的MyStructure
包含MyClass
类型的对象引用和int
(Int32
)。作业
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
更改为结构。