1

MSDN 文档中提到“结构在分配时被复制。当结构被分配给一个新变量时,所有数据都被复制,对新副本的任何修改都不会改变原始副本的数据。

我有一个结构,它有一个字符串数组作为其中的唯一字段。

struct MyVar
{
    private readonly string[] value;
    MyVar(string[] iVal)
    {
        value = iVal;
    }
}

当我将一个结构变量分配给另一个时,如何确保将字符串数组完全复制(深拷贝)到分配的变量。

4

1 回答 1

0

您不能在 C# 中执行此操作,因为无法拦截编译器生成的代码以将结构的数据从一个复制到另一个。

你唯一能做的就是让你的结构完全不可变。

这意味着:

  • 创建结构时,请对存储在结构中的任何可变引用类型(例如示例中的字符串数组)进行防御性副本。
  • 不要将可变引用类型对象传递给任何可以改变它们的对象。
  • 不要从结构中公开任何可变引用类型。这意味着您无法从结构中公开字符串数组。
  • 不要做任何改变结构中保存的任何引用类型的事情。因此,在您的示例中,您无法更改字符串数组的内容。

这是很多限制。最安全的方法是永远不要在你的结构中存储任何可变引用类型......

无论如何,为了使您的结构更安全,您可以防御性地复制字符串数组:

struct MyVar
{
    private readonly string[] value;
    MyVar(string[] iVal)
    {
        value = (string[])iVal.Clone();
    }
}

现在可以安全地复制该特定示例,因为它没有任何方法可以改变字符串数组。但是,一旦您添加任何 mutator 方法或通过属性公开字符串数组,或将其传递给任何可能对其进行变异的东西,您就会回到原点。

但是,如果您想制作结构的“手动”副本,则可以通过序列化来实现。

只是你无能为力:

MyVar var1 = new MyVar(test);
MyVar var2 = var1;
于 2013-05-09T11:31:14.697 回答