【C#】ジェネリック(Generics) ~<T>型 / 入門編 ~

  ■ ジェネリック

 * 型だけ違って、処理の内容が同じものを作る時に使う。
http://ufcpp.net/study/csharp/sp2_generics.html

  利点

クラスやメソッドを汎用的に使えるようにする

  構文

クラス定義
【アクセスレベル】class 【クラス名】<型引数>
{
  // クラス定義
}
メソッド定義
【アクセスレベル】 戻り値の型 メソッド名<型引数>(引数リスト)
{
  // メソッド定義
}

  サンプル

private void Swap<T>(ref T t1, ref T t2)
{
    T temp;
    
    temp = t1;
    t1 = t2;
    t2 = temp;
}

  参考資料

http://code.msdn.microsoft.com/10-C-6d9ce545/

 

  ■ ジェネリック型制約

 * whereを使って、条件を付け加えることが可能
 * 「,」で、複数指定も可能
http://ufcpp.net/study/csharp/sp2_generics.html#where

  構文

クラス定義
【アクセスレベル】class 【クラス名】<型引数>
  where 【型引数中の型が満たすべき条件】(, 【型引数中の型が満たすべき条件】)// <= オプション
{
  // クラス定義
}
メソッド定義
【アクセスレベル】 戻り値の型 メソッド名<型引数>(引数リスト)
  where 【型引数中の型が満たすべき条件】(, 【型引数中の型が満たすべき条件】)// <= オプション
{
  // メソッド定義
}
http://ufcpp.net/study/csharp/sp2_generics.html#merit

  制約条件

制約                   | 説明
-----------------------+---------------------------------------------
where T : struct       | 型 T は値型である
where T : class	       | 型 T は参照型である
where T : new()	       | 引数なしのコンストラクタを持つ。
where T : 【class】    | 型 T は 【class】 で指定された型を継承する。
where T : 【interface】| 型 T は 【interface】 で指定されたインターフェースを実装する。

  サンプル

* 詳細は以下の関連記事「ContextMenuStrip ~右クリックを使うには~」を参照のこと
private T GetSelectedControl<T>(object selectedControl)
    where T : class
{
    T returnValue = null;
    if (selectedControl != null && selectedControl is T)
    {
        returnValue = (T)selectedControl;
    }

    return returnValue;
}

private void copyToolStripMenuItem_Click(object sender, EventArgs e)
{
    var selectedTextBox =
        this.GetSelectedControl<TextBox>(this.selectedControl);
    if (selectedTextBox != null && selectedTextBox.SelectionLength > 0)
    {
        selectedTextBox.Copy();
    }
}

 

  ■ 使用上の注意

 * Nullableには明示的にできない模様(少なくとも.NET3.5ではコンパイルエラー)
  => X : <Nullable<T>>

 

  関連記事

  【C#ジェネリクスGenerics) ~<T>型 / サンプルプログラム編 ~

http://blogs.yahoo.co.jp/dk521123/32873022.html

  シリアライズ / デシリアライズ (Serialize / Deserialize)

http://blogs.yahoo.co.jp/dk521123/29113938.html

  ContextMenuStrip ~右クリックを使うには~

http://blogs.yahoo.co.jp/dk521123/22454285.html

  IS演算子 / AS演算子 / GetType().Name / Typeof ~キャスト関連の処理~

http://blogs.yahoo.co.jp/dk521123/19117857.html