0

私は構造とクラスを持っています

public class MyClass
{
    public string name;
}

public struct MyStructure
{
    public MyClass classValue;
    public int intValue;
    public MyStructure(MyClass classValue, int intValue)
    {
        this.classValue = classValue;
        this.intValue = intValue;
    }
}

他の場所では、次のコードを記述します。

MyClass class1 = new MyClass() { name = "AA" };
MyStructure struct1 = new MyStructure(class1, 4);
MyStructure struct2 = struct1;
struct1.classValue.name = "BB";  //struct2.classValue.name also change!

このような場合、構造体のすべての参照型メンバーが値によってコピーされるようにするにはどうすればよいですか?

4

2 に答える 2

1

タイプMyStructureのオブジェクト参照MyClassint( Int32) で構成されます。割り当て

MyStructure struct2 = struct1;

これらのデータ、参照、および整数のみをコピーします。の新しいインスタンスMyClassは作成されません。それを変更することはできません。

コピーしたい場合は、次のように言えます。

MyStructure struct2 = new MyStructure(
    new MyClass { name = struct1.classValue, },
    struct1.intValue
    );

もちろん、これを何度も行う必要がある場合は、これClone()だけを行うメソッドを作成できます。Cloneただし、割り当てだけでなく、メソッドを使用することを忘れないでください。

(ちなみに、MyStructureは「可変構造体」です。落胆する人も多いです。 MyStructureasのフィールドをマークしておけばreadonly、「多くの人」は満足すると思います。)

追加: Can structs contain references to reference types in C# への回答も参照してください。

于 2013-01-22T20:17:48.790 に答える
0

代入演算子は、構造体内の参照型フィールドをディープ コピーしません。ただし、ディープ コピーを手動で実行する独自のコピー コンストラクターを作成できます。

public MyStructure(MyStructure structure)
{
    classValue = new MyClass() { name = structure.classValue.name };
    intValue = structure.intValue;
}

次に、次を使用してコピー コンストラクターを呼び出します。

MyStructure struct2 = new MyStructure(struct1);

または、構造体に変更することもできますMyClass

于 2013-01-22T20:00:47.623 に答える