備忘録

政治/経済/自動運転/Python/Robotics

ジェネリック

ジェネリック::C++でいう実行時template<T>みたいなもん(だと勝手に思ってる)

 

C#2.0でジェネリックが登場する以前は、さまざまなデータを操作する汎用的なコードを実装する際に、object型の参照変数が利用されていた。ジェネリックは、実行時の型キャストを行う必要がなく、実行時エラーをコンパイル時エラーに落とし込めたところが最大のメリットである。

 

堅苦しい言葉でいえば、

「オープン構築型」に「型引数」を代入し、「クローズ構築型」を作成する。

(わかりにくすぎw)

 

ジェネリック型は型キャストを一切行わない点で安全性を確保できる。

 

1.ジェネリッククラス

 class classname<T> { // ...

 classname <T> hoge = new classname <T> (arg1, arg2, ...

 

2.基本クラス制約  where T : base-classname

 特定の型から継承しなければならないという制限を加える。

 -特定のメソッドやプロパティの操作を可能にできる

 -制限を与えられる

 

3.インターフェイス制約 where T : interfacename1, ...

 型パラメーターにあてはめられる型に対して、特定のインターフェイスを実装するように制約を加えることができる。

 

4.コンストラクター制約 where T : new()

 型パラメーターにあてはめる型は、引数無しのコンストラクターを持つことを要求し、この型からインスタンスを作成できるようにする。

 

5.参照型制約 where T : class

 

6.値型制約 where T : struct

 

注)複数の制約の利用:

 基本クラス制約、参照型制約、値型制約はどれか一つしか利用不可

 そのあとに、インターフェイス制約

 そのあとに、コンストラクター制約

 の順番で記述しなければならない。

 

7.型パラメーターのデフォルト値 default(T)

 

8.ジェネリックメソッド

 引数の型に応じて、型の推論ができるため、明示的に型を指定する必要はない。

 (例外あり