【LINQの前に】ラムダ式?デリゲート?Func<T, TResult>?な人へのまとめ【知ってほしい】

qiita.com

ラムダ式を記述するとどうなるか

 この投稿では 「デリゲートはメソッドを参照する型」 と述べてきました。そして匿名関数(匿名メソッド式・ラムダ式)を使えば、メソッドを作らなくてもインラインで処理を記述してデリゲートのインスタンスを生成できることを説明しました。

 一見この二つは矛盾しているようにも見えます。匿名関数によりインラインで記述した処理はメソッドではないように見えるからです。

 実際にはこれらは矛盾していません。デリゲートはメソッドを参照する型ですし、匿名関数(匿名メソッド式・ラムダ式)を使ってデリゲートを生成することが可能です。

 それにはコンパイラが関係します。コンパイラは匿名関数を記述された場合、その匿名関数の記述に該当するクラスメソッドまたはインスタンスメソッド、もし必要であれば新たにクラスを生成します。匿名関数によるデリゲートは、これらのコンパイラが生成したメソッドを参照するデリゲートとして生成されるのです。

ActionとFunc

  • Action型、引数とらず返り値も返さないメソッドを参照するデリゲートの型
  • Action型、T型の引数を取って返り値を返さないメソッドを参照するデリゲートの型
  • Action<T1,T2>型、T1型、T2型の引数を取って返り値を返さないメソッドを参照するデリゲートの型
  • Func型、引数とらずTResult型の返り値を返すメソッドを参照するデリゲートの型
  • Func<T1,T2,TResult>型、T1型、T2型の引数を取りTResult型の返り値を返すメソッドを参照するデリゲートの型