2009年10月10日

【ラムダ式】 定義済みデリゲート一覧

今回は定義済みデリゲートのお話です。
定義済みデリゲートとは、クラスライブラリで定義されているラムダ式を格納出来る型のことです。
前回までのサンプルコードでは、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 特定の型のオブジェクトを別の型のオブジェクトに変換

上記の定義済みデリゲート以外にも、自分で任意のデリゲート型を定義してラムダ式を代入することも出来ます。
ただ、これらの汎用的なデリゲートを使えば定義を省けるので楽出来るというわけですね。

ラムダ式の先頭記事へ ラムダ式の次の記事へ
ラベル:ラムダ式
posted by 吾一 at 23:13| 2. ラムダ式 | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。