C#にてclassを変数のようにコピーしたいときがあります。ここでは、classをコピー(クローンの作成)出来るようにする方法を説明します。

インスタンス内のメンバを手動でコピーするか、ICloneableを実装してClone()を作成するか、2つの方法があり

また、 コピーをする際、シャローコピー (Shallow Copy) と、ディープコピー (Deep Copy) の2通りあります。

シャローコピーは、インスタンス内の参照型のメンバについては、参照先のインスタンスそのものがコピーされるのではなく、参照先を示すアドレスがコピーされます。

ディープコピーは、インスタンス内の参照型のメンバについてもインスタンスそのものがコピーされます。

ICloneable インターフェイスで、クローン生成する(基本的な使用方法です)

class CS : ICloneable {
  private int x = 100;
  public ArrayList list = new ArrayList();
  public int GetX() { return x; }
  public object Clone()                       // 必須 ICloneableのMemberwiseClone();にてコピーを行う
  {
    return MemberwiseClone();
  }
}

※参照型のメンバについては、参照先のインスタンスそのものがコピーされるのではなく、参照先を示すアドレスがコピーされます。

 

シャローコピーとディープコピー

class CS : ICloneable {
  private int x = 100;
  public ArrayList list = new ArrayList();         //参照型
  public int GetX()
  {
    return x;
  }

  public object Clone()                            // シャローコピーになります。
  {
    return MemberwiseClone();
  }

  public CS ShallowCopy()                          //シャローコピー
  {
    return (CS)this.Clone();
  }

  public CS DeepCopy()                             //ディープコピー
  {
    CS obj = (CS)this.Clone();
    obj.list = (ArrayList)this.list.Clone();       //参照型は全てインスタンスをコピーする
    return (CS)Clone();
  }
}

※ICloneable でクローン生成するとシャローコピーになります。