型を柔軟に扱う「ジェネリクス(Generics)」とは?
C#の ジェネリクス(Generics) は、クラス・メソッド・インターフェースにおいて、データの型を後から指定できる仕組みです。
汎用的かつ型安全なコードを記述できるため、コレクション操作などで非常に便利です。
基本構文
class クラス名<T> {
public T Value;
}
例:ジェネリッククラス
public class Box<T> {
public T Content;
public void Show() {
Console.WriteLine("中身: " + Content);
}
}
Box<string> strBox = new Box<string>();
strBox.Content = "Hello";
strBox.Show(); // → 中身: Hello
Box<int> intBox = new Box<int>();
intBox.Content = 123;
intBox.Show(); // → 中身: 123
ジェネリックメソッド
public class Util {
public static void Swap<T>(ref T a, ref T b) {
T temp = a;
a = b;
b = temp;
}
}
int x = 1, y = 2;
Util.Swap(ref x, ref y);
Console.WriteLine(x); // → 2
Console.WriteLine(y); // → 1
標準ライブラリでの使用例
List<T>
:汎用リスト
Dictionary<TKey, TValue>
:キーと値のペア
Queue<T>
/ Stack<T>
:データ構造
List<string> names = new List<string>();
names.Add("太郎");
names.Add("花子");
foreach (var name in names) {
Console.WriteLine(name);
}
型制約(where句)
ジェネリックに制限を加えたい場合は、where
を使って条件を指定できます。
public class Manager<T> where T : new() {
public T Create() {
return new T(); // Tは引数なしのコンストラクタを持つ必要あり
}
}
ジェネリクスのメリット
- 型安全性が高い(キャスト不要)
- コードの再利用性が高い
- パフォーマンス向上(ボクシング/アンボクシングが不要)
まとめ
ジェネリクス(Generics)は、クラスやメソッドで扱うデータの型を柔軟に指定できる仕組みです。
型安全性を保ちながら再利用性の高いコードを実現できるため、List<T>
やDictionary<TKey, TValue>
など、多くの標準機能でも使われています。
「型をあとで決めたい」=ジェネリクスの出番!と覚えましょう。