このTは型引数と呼ばれるもので<>でくくって表現されます※1。こんな感じ。
class everyClass<T>
{
public T everyProperty {get; set;}
}
static void everyMethod<T>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
型引数?。
つまりは型を引数として渡すものです。
今までは引数はintやStringといった型を使って宣言していました。
メソッドには引数があって、引数によって動的に値を受け取りながら処理を行うことができます。
今までの言語ではintやStringといった型については変更できませんでした。
この型引数を使用する事によって引数の型を変更する事ができるようになります。
同じクラスを使って複数の型を使って呼び出してみます。
using System;
class Sample
{
// メインプログラム。ここからスタート
static void Main(string[] args)
{
// 整数で使うために生成
var a = new everyClass<int>();
// 文字列で使うために生成
var b = new everyClass<string>();
a.everyProperty = 123; // 整数でも
a.everyProperty = "abc"; // 文字列でも
// 使えます
}
}
// 整数でも文字列でも使える万能クラス!
class everyClass<T>
{
public T everyProperty {get; set;}
}
このように同じクラスなのに異なる型で使用する事ができます。
私はたくさんあるデータの型に対して同じような処理を行いたい時によく使用します。
この万能クラスは複数の型を扱う事もできます。もちろんメソッドもできます。
class everyClass<T1,T2>
{
public T1 everyProperty1 {get; set;}
public T2 everyProperty2 {get; set;}
}
static void everyMethod<T1,T2>(ref T lhs, ref T rhs)
{
T temp;
temp = lhs;
lhs = rhs;
rhs = temp;
}
型引数には制約条件があります。
なんで制約があるの???。という感じですが次のような意味があります。
型として使用できるものを限定する事で自前でチェックするようなロジックを作成する手間を省く事ができます。
たとえばwhereキーワードで型名を指定すると、
その型名と継承された型のみが型引数として指定できるようになります。
class everyClass<T> where T:String
{
public T everyProperty {get; set;}
}
where制約の場合は使える型を限定するために使用します。
型引数の制約に関して詳しく知りたい方はこちらをどうぞ(Microsoftのページです)