定義済みデリゲートとは、クラスライブラリで定義されているラムダ式を格納出来る型のことです。
前回までのサンプルコードでは、Actionデリゲート型のみを使用しましたが、
.NET FrameworkにはAction以外にもラムダ式に使用できる型が定義されています。
以下のコードを御覧ください。
class Program { static void Main(string[] args) { // string型の引数1つ、戻り値voidのラムダ式 Action<string> lambda1 = (string message) => /* 括弧の中に型を明示しても良い */ { // 引数で受け取った文字列を表示 Console.WriteLine(message); }; // string型の引数1つを受け取り、int型の戻り値を返すラムダ式 Func<string, int> lambda2 = (message) => { Console.WriteLine(message); // int型を返す return 0; }; // string型の引数1つを受け取り、bool型の戻り値を返すラムダ式 Predicate<string> lambda3 = (message) => { Console.WriteLine(message); // bool型を返す return true; }; // 引数なし、戻り値voidのラムダ式を呼び出し( void lambda1(string)の呼び出しと同じ ) lambda1("ラムダ式に引数を渡して実行!"); // 引数1つ、戻り値intのラムダ式を呼び出し( int lambda2(string)の呼び出しと同じ ) int retInt = lambda2("ラムダ式に引数を渡し、int型の戻り値を受け取る!"); Console.WriteLine("lambda2の戻り値=" + retInt); // 引数1つ、戻り値boolのラムダ式を呼び出し( bool lambda3(string)の呼び出しと同じ ) bool retBool = lambda3("ラムダ式に引数を渡し、bool型の戻り値を受け取る!"); Console.WriteLine("lambda3の戻り値=" + retBool); // <結果> // ラムダ式に引数を渡して実行! // ラムダ式に引数を渡し、int型の戻り値を受け取る! // lambda2の戻り値=0 // ラムダ式に引数を渡し、bool型の戻り値を受け取る! // lambda3の戻り値=True } }Action<string>型は、引数がstring、戻り値がvoidのラムダ式を代入可能です。
Func<string, int>型は、引数がstring、戻り値がintのラムダ式を代入可能です。
Predicate<string>型は、引数がstring、戻り値がboolになるラムダ式を代入可能です。
Action<T>、Func<T, TResult>、Predicate<T>は、それぞれTの部分に任意の型が指定出来るジェネリックデリゲートと呼ばれるものです。
デリゲート型の変数には、型が一致するラムダ式を代入することが出来ます。(=引数と戻り値の型が全く同じメソッドのみ代入出来るということ)
これらは、.NET Frameworkにて標準で用意されているものなのでいつでも自由に使うことが出来ます。
以下、定義済みデリゲートの一覧です。
型 | .NETバージョン | 備考 | |
MethodInvoker | 引数:なし 戻り値:void |
1.0 | プロジェクトの参照設定でSystem.Windows.Forms.dllを追加する必要がある。 |
Action | 引数:なし 戻り値:void |
3.5 | MethodInvokerよりはこちらを使うほうが良い |
Action<T> | 引数:任意の型1個 戻り値:void |
2.0 | Tには引数の型を指定する |
Action<T1, T2> Action<T1, T2, T3> Action<T1, T2, T3, T4> |
引数:任意の型2〜4個 戻り値:void |
3.5 | T1〜T4には引数の型を指定する |
Func<TResult> Func<T, TResult> Func<T1, T2, TResult> Func<T1, T2, T3, TResult> Func<T1, T2, T3, T4, TResult> |
引数:任意の型0〜4個 戻り値:任意の型 |
3.5 | TResultは戻り値の型、T1〜T4には引数の型を指定する |
Predicate<T> | 引数:任意の型1個 戻り値:bool |
2.0 | 戻り値は暗黙的にbool |
Comparison<T> | 引数:任意の型2個 戻り値:int |
2.0 | Sortなどでの比較用デリゲート |
Converter<TInput, TOutput> | 引数:任意の型1個 戻り値:TOutput |
2.0 | 特定の型のオブジェクトを別の型のオブジェクトに変換 |
上記の定義済みデリゲート以外にも、自分で任意のデリゲート型を定義してラムダ式を代入することも出来ます。
ただ、これらの汎用的なデリゲートを使えば定義を省けるので楽出来るというわけですね。
ラムダ式の先頭記事へ ラムダ式の次の記事へ
タグ:ラムダ式