C#自动深层复制struct

3Pi*_*3Pi 12 c# struct deep-copy default-copy-constructor

我有一个结构,MyStruct有一个私有成员private bool[] boolArray;和一个方法ChangeBoolValue(int index, bool Value).

我有一个班,MyClass有一个领域public MyStruct bools { get; private set; }

当我从现有的MyStruct对象创建一个新的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
Run Code Online (Sandbox Code Playgroud)

有没有办法强制副本实现更深层次的副本,或者有没有办法实现这个不会有同样的问题?

我特意将MyStruct设为结构,因为它是值类型,我不希望引用传播.

Chr*_*air 10

运行时执行结构的快速内存复制,据我所知,不可能为它们引入或强制执行自己的复制过程.您可以引入自己的Clone方法甚至是复制构造函数,但不能强制它们使用它们.

如果可能,最好的办法是使结构不可变(或不可变类)或重新设计以避免此问题.如果您是API的唯一消费者,那么也许您可以保持警惕.

Jon Skeet(和其他人)已经描述了这个问题,虽然可以有例外,但一般来说:可变结构是邪恶的. 结构体可以包含引用类型的字段