C# 结构的自动深拷贝

标签 c# struct deep-copy default-copy-constructor

我有一个结构 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/

相关文章:

c# - ASP.NET MVC2 和 MEF - 为什么我的 MefControllerFactory 无法获取导出或元数据?

c# - 更新亚马逊商城中的商家订单 ID

c# - 获取书签处的文本

c++ - 如何在 C++ 中将链表结构返回到 main?

c++ - C++ 结构可以转换为 Microsoft Bond 结构吗?

python - Networkx 复制说明

c# - 我想在 C# unity3D 中实例化一个通用类型

c++ - 具有包含 void* 的结构的函数的 const 正确性和参数

java - 深度复制,JUnit 测试 Java

arrays - 数组变量共享多少信息?