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();
    }
}

その特定の例は、文字列配列を変更する方法がないため、安全にコピーできます。しかし、ミューテーター メソッドを追加するか、プロパティを介して文字列配列を公開するか、それを変更する可能性のあるものに渡すとすぐに、振り出しに戻ります。

ただし、構造体の「手動」コピーを作成したい場合は、シリアル化を介して行うことができます。

それはあなたが何もできないということです:

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