連載:[完全版]究極の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; }
匿名メソッド

(x, y) => 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は必要だが、式である、

1 + 2

にreturnは必要ないのと同じである。これでreturnの6文字が減った。

 引数の型指定がないことは、型の厳密なチェックがおろそかになると心配する人や、面倒な型宣言がなくなってアバウトに書けるようになると喜んだ人がいるかもしれないが、どちらもハズレである。リスト7.9では、Calculateメソッドの引数はSampleDelegateという型であり、SampleDelegateデリゲートの引数はint型が2つと宣言されているので、いちいちラムダ式で宣言しなくとも、xとyはそれぞれint型に確定する。

 念のために補足すると、これはラムダ式固有のものではない。匿名メソッドでは確かに引数は明示的に型を添えて示す必要があったが、戻り値の型については同様の手段により推測されていた。逆にいえば、そのような推測ができない状況では、匿名メソッドもラムダ式も使用できない。型が確定しないアバウトな状態ではエラーになり使えない、ということである。

 次に、中カッコが消えた理由と文末のセミコロンが消えた理由は、returnが消えた理由と同じで、ラムダ式はそれ自身が「式」だからである(逆に、前章で紹介したように中カッコを付ければラムダ式も「ステートメント型のラムダ」として文を記述できる)。

 以上である。ラムダ式は、タネも仕掛けもなく、厳密さを損なうこともなく、圧倒的な構文の短さを実現している。

*3 「=>演算子」に特別な読み方はない。おそらく「イコール不等号演算子」のような読み方でよいと思うが、この演算子が語られる機会はあまりないので他人がどのように呼んでいるのかはよくわからない。たいていは、この演算子ではなくラムダ式について語られることになる。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter7 ラムダ式(後編)
    1.7.1 ラムダ式は何をもたらすか?
  2.7.2 ラムダ式と匿名メソッドの違い
    3.7.3 ステートメント型のラムダ
    4.7.4 式形式のラムダの可能性
    5.7.5 型指定を省略できる場合、できない場合
    6.7.6 何もしないラムダ式
    7.7.7 ラムダ式の使用例/【C#olumn】「=>」は不等号?
    8.7.8 ラムダ式のさまざまなバリエーション
    9.7.9 ジェネリックメソッドと型推論
    10.7.10 オーバーロードの解決/値型と参照型の相違は何か?/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間