19

次のクラスがあるとします。

class A
{
    public List<B> ListB;

    // etc...
}

B他のクラスを継承/含む可能性のある別のクラスはどこにありますか。


このシナリオを考えると:

  1. Aは大きなクラスであり、多くの参照型が含まれています
  2. のソースコードにアクセスできないため、マークBを付けることができません[Serializable]B

ディープコピーを実行する次の方法は機能しません。

  1. 使用できないICloneableMemberwiseClone、クラスAに多くの参照型が含まれているため
  2. クラスが大きく、継続的に追加されており、ディープコピーできないAクラス(など)が含まれているため、のコピーコンストラクタを記述できません。B
  3. B含まれているクラス(ソースコードが利用できない場合など)を次のようにマークできないため、シリアル化を使用できません[Serializable]

クラスをディープコピーするにはどうすればよいAですか?

4

7 に答える 7

10

とにかく、十分な制御がないため (すべてのクラスを同じ方法でコピーする必要はありません)、ディープ コピーにシリアライゼーションを使用するのをやめました。次に、独自のディープ コピー インターフェイスを実装し、すべてのプロパティをコピーする必要がある方法でコピーし始めました。

参照型をコピーする一般的な方法:

  • コピー コンストラクターを使用する
  • ファクトリ メソッドを使用する (例: 不変型)
  • 独自の「クローン」を使用する
  • コピーのみの参照 (例: その他のルート タイプ)
  • 新しいインスタンスを作成し、プロパティをコピーします (例: コピー コンストラクターがない、自分で作成したものではない型)

例:

class A
{
  // copy constructor
  public A(A copy) {}
}

// a referenced class implementing 
class B : IDeepCopy
{
  object Copy() { return new B(); }
}

class C : IDeepCopy
{
  A A;
  B B;
  object Copy()
  {
    C copy = new C();

    // copy property by property in a appropriate way
    copy.A = new A(this.A);
    copy.B = this.B.Copy();
  }
}

これは大変な作業だと思うかもしれません。しかし、最終的には、簡単で単純明快で、必要に応じて調整でき、必要なことを正確に実行できます。

于 2010-03-30T12:46:50.523 に答える
0
    private interface IDeepCopy<T> where T : class
    {
        T DeepCopy();
    }

    private class MyClass : IDeepCopy<MyClass>
    {
        public MyClass DeepCopy()
        {
            return (MyClass)this.MemberwiseClone();
        }
    }

プラス:Yoyはコピープロセスを制御できます(クラスに識別子プロパティがある場合は、それらを設定するか、他のビジネスロジックコードを記述できます)


マイナス:クラスは封印済みとしてマークできます


于 2013-02-15T18:59:39.667 に答える
0

これできないの?

[Serializable]
class A
{
     ...
    [NonSerialized]
    public List<B> ListB;
    ....
}

次に、.NET (具体的には C#) でオブジェクトのディープ コピーを行うにはどうすればよいですか?を参照してください。クローニング機能用

于 2010-03-30T12:31:13.340 に答える
0

インターフェイス IDeepCopy はまさにICloneableが指定するものです。

class B : ICloneable
{
     public object Clone() { return new B(); }
}

そしてよりフレンドリーな実装で:

class B : ICloneable
{
     public B Clone() { return new B(); }
     // explicit implementation of ICloneable
     object ICloneable.Clone() { return this.Clone(); }
}
于 2010-09-08T21:37:03.710 に答える
-1

jsonシリアライゼーションを使用することが私が見た中で最高であるという別のスレッドからの回答。

public static T CloneJson<T>(this T source)
{      
    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }    
    return JsonConvert.DeserializeObject<T>(JsonConvert.SerializeObject(source));
}
于 2015-10-14T16:01:17.093 に答える