47

クラスがあるとしましょう:

class obj
{
  int a;
  int b;
}

そして、私はこのコードを持っています:

obj myobj = new obj(){ a=1, b=2}
obj myobj2 = myobj;

上記のコードは、最初の obj への参照を作成します。私が欲しいのは、変更が元に反映されていないmyobj2のコピーを参照することです。myobj私はSOを検索しましたが、これまでの解決策は複雑に思えます。これを行う簡単な方法はありますか。私は.net 4.5を使用しています

4

2 に答える 2

97

オブジェクトのプロパティは値型であり、次のような状況で浅いコピーを使用できます。

obj myobj2 = (obj)myobj.MemberwiseClone();

ただし、メンバーが参照型である場合など、他の状況では、ディープ コピーが必要です。クラスの助けを借りてSerializationDeserializationのテクニックを使用して、オブジェクトのディープ コピーを取得できます。BinaryFormatter

public static T DeepCopy<T>(T other)
{
    using (MemoryStream ms = new MemoryStream())
    {
        BinaryFormatter formatter = new BinaryFormatter();
        formatter.Context = new StreamingContext(StreamingContextStates.Clone);
        formatter.Serialize(ms, other);
        ms.Position = 0;
        return (T)formatter.Deserialize(ms);
    }
}

設定の目的StreamingContext: インターフェイスを実装するか、 、 、 、 などの組み込み属性を使用して、コードに特別なシリアライゼーションおよびデシリアライゼーション ロジックを導入できISerializableます。いずれの場合も、引数としてメソッド (およびインターフェイスの場合は特別なコンストラクター) に渡されます。に設定すると、シリアライゼーションの目的についてそのメソッドにヒントが与えられます。OnDeserializedOnDeserializingOnSerializingOnSerializedStreamingContextISerializableContextStateClone

追加情報: (この記事はMSDNからも読むことができます)

浅いコピーとは、新しいオブジェクトを作成してから、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーすることです。フィールドが値型の場合、フィールドのビットごとのコピーが実行されます。参照型の場合、参照はコピーされますが、参照されるオブジェクトはコピーされません。したがって、元のオブジェクトとそのクローンは同じオブジェクトを参照します。

ディープ コピーは、新しいオブジェクトを作成し、現在のオブジェクトの非静的フィールドを新しいオブジェクトにコピーします。フィールドが値型の場合、フィールドのビットごとのコピーが実行されます。フィールドが参照型の場合、参照されたオブジェクトの新しいコピーが実行されます。

于 2013-05-22T16:05:12.697 に答える