我有一个结构 MyStruct
,它有一个私有(private)成员 private bool[] boolArray;
和一个方法 ChangeBoolValue(int index, bool Value)
。
我有一个类 MyClass
,它有一个字段 public MyStruct bools { get;私有(private)集; }
当我从现有对象创建一个新的 MyStruct 对象,然后应用方法 ChangeBoolValue() 时,两个对象中的 bool 数组都被更改,因为引用,而不是被引用的内容,被复制到新对象。例如:
MyStruct A = new MyStruct();
MyStruct B = A; //Copy of A made
B.ChangeBoolValue(0,true);
//Now A.BoolArr[0] == B.BoolArr[0] == true
有没有办法强制副本实现更深的副本,或者有没有办法实现这个不会有同样的问题?
我特意将 MyStruct 设为结构体,因为它是值类型,我不希望引用传播。
最佳答案
运行时执行结构的快速内存复制,据我所知,不可能为它们引入或强制执行您自己的复制过程。您可以引入自己的 Clone
方法,甚至是复制构造函数,但不能强制他们使用它们。
如果可能的话,你最好的选择是让你的结构不可变(或不可变的类)或者重新设计来避免这个问题。如果您是 API 的唯一使用者,那么也许您可以保持额外的警惕。
Jon Skeet(和其他人)描述了这个问题,虽然也有异常(exception),但一般来说:可变结构是邪恶的。 Can structs contain fields of reference types
关于C# 结构的自动深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11336935/