Back to Top

Monthly Archives: 3月 2016

C# classをコピーする

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 でクローン生成するとシャローコピーになります。

 

VB.NETデータ型

型 読み方 名称 説明
Boolean ブール 論理型 True, False
Byte バイト バイト型 0 ~ 255
Char キャラ 文字型 0 ~ 65535
Short ショート 整数型 -32,768 ~ 32,767
Integer インテジャー 整数型 -2,147,483,648 ~ 2,147,483,647
Long ロング 長整数型 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
Single シングル 単精度浮動小数点型
Double ダブル 倍精度浮動小数点型
Decimal デシマル 十進型(固定小数点型) ±79,228,162,514,264,337,593,543,950,335

同じ桁数内で小数点使用

String ストリング 文字列型 文字列
Date デイト 日付型 1年1月1日~9999年12月31日
Object オブジェクト オブジェクト型