C#Generics
Genericは、特定の形式ではなく、一般的な形式を意味します。 C#では、汎用とは、特定のデータ型に固有ではないことを意味します。
C#では、typeパラメーターを使用して、特定のデータ型を使用せずに、汎用クラス、インターフェイス、抽象クラス、フィールド、メソッド、静的メソッド、プロパティ、イベ 型パラメータはプレースホルダーを特定の指定された型の作成時にインスタンスの汎用タイプです。
ジェネリック型は、型名の後に山かっこで型パラメータを指定することによって宣言されます。, TypeName<T>
ここで、T
は型パラメーターです。
ジェネリッククラス
ジェネリッククラスは、クラス名の後に山かっこで囲まれた型パラメータを使用して定義されます。 ジェネリッククラスを定義します。
上で、DataStore
はジェネリッククラスです。, T
は型パラメーターと呼ばれ、DataStore
クラスのフィールド、プロパティ、メソッドパラメーター、戻り値の型、およびデリゲートの型として使用できます。 たとえば、Data
は、特定のデータ型の代わりに型パラメータT
を型として使用したため、汎用プロパティです。
T
を使用する必要はありません。 型パラメータには任意の名前を付けることができます。, 通常、T
は、型パラメータが一つだけの場合に使用されます。 TSession
、TKey
、TValue
などの要件に従って、より読みやすい型パラメータ名を使用することをお勧めします。 型パラメーターの名前付けガイドラインの詳細複数の型パラメーターをカンマで区切って定義することもできます。
ジェネリッククラスのインスタンス化
ジェネリッククラスのインスタンスを作成するには、山かっこで実際の型を指定します。, 次に、ジェネリッククラスDataStore
のインスタンスを作成します。
上記では、インスタンスの作成中に山かっこでstring
タイプを指定しました。 したがって、T
は、string
タイプに置き換えられます。T
がコンパイル時にクラス全体で使用されます。 したがって、Data
プロパティのタイプはstring
になります。
次の図は、ジェネリックの仕組みを示しています。,
Data
プロパティに文字列値を割り当てることができます。 String以外の値を代入しようとすると、コンパイル時エラーになります。
以下に示すように、異なるオブジェクトに対して異なるデータ型を指定できます。
ジェネリッククラスの特性
- ジェネリッククラスは再利用性を高めます。 型パラメーターが多いほど、再利用可能になります。, しかし、一般化が多すぎると、コードを理解し維持することが困難になります。
- 汎用のクラスの基底クラスには他のジェネリックまたは非汎用クラスや抽象クラス.ジェネリッククラスは、他のジェネリックまたは非ジェネリックインターフェイス、クラス、または抽象クラスから派生できます。
ジェネリックフィールド
ジェネリッククラスにはジェネリックフィールドを含めることがで ただし、初期化することはできません。
次に、ジェネリック配列を宣言します。,
ジェネリックメソッド
戻り値の型またはパラメーターの型パラメーターで宣言されたメソッドは、ジェネリックメソッドと呼ばれます。
上記では、AddorUpdate()
およびGetData()
メソッドは一般的なメソッドです。 item
パラメータの実際のデータ型は、DataStore<T>
クラスのインスタンス化時に指定されます。,
汎用パラメータの型で使用でき複数のパラメータの有無非汎用パラメータを返します。 以下は有効な汎用メソッドのオーバーロードです。
非汎用クラスが一般的方法を指定するタイプのパラメータに角括弧のメソッド名として以下に示します。
ジェネリックの利点
- ジェネリックは、コードの再利用性を高めます。 異なるデータ型を処理するコードを記述する必要はありません。
- ジェネリックはタイプセーフです。, 定義で指定されたデータ型とは異なるデータ型を使用しようとすると、コンパイル時エラーが発生します。
- Genericには、ボックス化とアンボックス化の可能性がなくなるため、パフォーマンス上の利点があります。