|
|
連載:[完全版]究極のC#プログラミング
Chapter7 ラムダ式(後編)
川俣 晶
2009/11/02 |
|
|
7.2 ラムダ式と匿名メソッドの違い
さて、なぜラムダ式は匿名メソッドよりも短く書けるのだろうか? そんな手品のようなことが本当に可能なのだろうか? 何か重要な情報が欠落しているのではないだろうか?
その疑問に答えるために、匿名メソッドとラムダ式を比較しながらラムダ式の書き方を見てみよう(リスト7.9参照)。
using System;
delegate int SampleDelegate(int x, int y);
class Program
{
private static void Calculate(int x, int y, SampleDelegate calculator)
{
Console.WriteLine(calculator(x, y));
}
static void Main(string[] args)
{
// 匿名メソッド
Calculate(1, 2,
delegate(int x, int y) { return x + y; }); // 出力:3
// ラムダ式
Calculate(1, 2, (x, y) => x + y); // 出力:3
}
}
|
|
リスト7.9 匿名メソッドとラムダ式の比較 |
このプログラムの次の部分が、それぞれ匿名メソッドとラムダ式である。
delegate(int x, int y) { return x + y; }
|
|
匿名メソッド |
この2つを見比べると、次のことがわかるだろう。
- delegateキーワードが消えた
- returnキーワードが消えた
- 引数の型指定(int)が消えた
- 中カッコ({、})が消えた
- 文末のセミコロン(;)が消えた
- 「=>」の2文字が増えた
以下、これらを1つ1つ検証していこう。
まず、ラムダ式で使用されている「=>」は「=>演算子」といわれ*3、「〜に入力」と読む。上記の場合、「x、yをx + yに入力」と読む(とはいえ、無理にそう読む必要はない。筆者はいちいち「〜に入力」とは読んでいない)。
delegateキーワードは単に消えたのではなく、=>演算子に置き換えられたと考えるとわかりやすいだろう。これらはそれぞれ、「匿名メソッドである」、「ラムダ式である」という意図を示す重要な記述である。これによって、delegateの8文字が「=>」の2文字に減って6文字減である。
次のreturnキーワードだが、ラムダ式はそれ自身が「式」であるため、returnなしで値を得ることができる。前章で紹介した書式でステートメントブロックとして記述する場合はreturn文が必要になるが、それとは別の書式のラムダ式もありうるわけである。これは、たとえば、
int method() { return 1 + 2; }
|
|
にreturnは必要だが、式である、
にreturnは必要ないのと同じである。これでreturnの6文字が減った。
引数の型指定がないことは、型の厳密なチェックがおろそかになると心配する人や、面倒な型宣言がなくなってアバウトに書けるようになると喜んだ人がいるかもしれないが、どちらもハズレである。リスト7.9では、Calculateメソッドの引数はSampleDelegateという型であり、SampleDelegateデリゲートの引数はint型が2つと宣言されているので、いちいちラムダ式で宣言しなくとも、xとyはそれぞれint型に確定する。
念のために補足すると、これはラムダ式固有のものではない。匿名メソッドでは確かに引数は明示的に型を添えて示す必要があったが、戻り値の型については同様の手段により推測されていた。逆にいえば、そのような推測ができない状況では、匿名メソッドもラムダ式も使用できない。型が確定しないアバウトな状態ではエラーになり使えない、ということである。
次に、中カッコが消えた理由と文末のセミコロンが消えた理由は、returnが消えた理由と同じで、ラムダ式はそれ自身が「式」だからである(逆に、前章で紹介したように中カッコを付ければラムダ式も「ステートメント型のラムダ」として文を記述できる)。
以上である。ラムダ式は、タネも仕掛けもなく、厳密さを損なうこともなく、圧倒的な構文の短さを実現している。
*3 「=>演算子」に特別な読み方はない。おそらく「イコール不等号演算子」のような読み方でよいと思うが、この演算子が語られる機会はあまりないので他人がどのように呼んでいるのかはよくわからない。たいていは、この演算子ではなくラムダ式について語られることになる。
|
Insider.NET 記事ランキング
本日
月間