您不能在 C# 中执行此操作,因为无法拦截编译器生成的代码以将结构的数据从一个复制到另一个。
你唯一能做的就是让你的结构完全不可变。
这意味着:
- 创建结构时,请对存储在结构中的任何可变引用类型(例如示例中的字符串数组)进行防御性副本。
- 不要将可变引用类型对象传递给任何可以改变它们的对象。
- 不要从结构中公开任何可变引用类型。这意味着您无法从结构中公开字符串数组。
- 不要做任何改变结构中保存的任何引用类型的事情。因此,在您的示例中,您无法更改字符串数组的内容。
这是很多限制。最安全的方法是永远不要在你的结构中存储任何可变引用类型......
无论如何,为了使您的结构更安全,您可以防御性地复制字符串数组:
struct MyVar
{
private readonly string[] value;
MyVar(string[] iVal)
{
value = (string[])iVal.Clone();
}
}
现在可以安全地复制该特定示例,因为它没有任何方法可以改变字符串数组。但是,一旦您添加任何 mutator 方法或通过属性公开字符串数组,或将其传递给任何可能对其进行变异的东西,您就会回到原点。
但是,如果您想制作结构的“手动”副本,则可以通过序列化来实现。
只是你无能为力:
MyVar var1 = new MyVar(test);
MyVar var2 = var1;