■ ジェネリック
* 型だけ違って、処理の内容が同じものを作る時に使う。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>>