C# でこれを行うことはできません。コンパイラによって生成されたコードをインターセプトして構造体のデータを別のデータにコピーする方法がないからです。
実際にできる唯一のことは、構造体を完全に不変にすることです。
つまり、次のことを意味します。
- 構造体を作成するときは、構造体内に保存する変更可能な参照型 (例の文字列配列など) の防御コピーを作成します。
- 変更可能な参照型オブジェクトを、それらを変更できるものに渡さないでください。
- 構造体から変更可能な参照型を公開しないでください。これは、構造体から文字列配列を公開できなかったことを意味します。
- 構造体に保持されている参照型を変更するために何もしないでください。したがって、あなたの例では、文字列配列の内容を変更できませんでした。
それは多くの制限です。最も安全な方法は、変更可能な参照型を構造体に格納しないことです...
とにかく、構造体をより安全にするために、文字列配列を防御的にコピーできます。
struct MyVar
{
private readonly string[] value;
MyVar(string[] iVal)
{
value = (string[])iVal.Clone();
}
}
その特定の例は、文字列配列を変更する方法がないため、安全にコピーできます。しかし、ミューテーター メソッドを追加するか、プロパティを介して文字列配列を公開するか、それを変更する可能性のあるものに渡すとすぐに、振り出しに戻ります。
ただし、構造体の「手動」コピーを作成したい場合は、シリアル化を介して行うことができます。
それはあなたが何もできないということです:
MyVar var1 = new MyVar(test);
MyVar var2 = var1;