gpt4 book ai didi

C# 结构的自动深拷贝

转载 作者:可可西里 更新时间:2023-11-01 08:22:00 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com