C#における匿名メソッドからラムダ式への進化

~読みやすく、書きやすく、強力に~


はじめに

C#では、関数を引数として扱う場面が増えています。

特にLINQ(Language Integrated Query)の登場以降、関数を値のように扱う技法は、C#開発者にとって欠かせないスキルとなりました。

この記事では、その中核をなす「匿名メソッド」から「ラムダ式」への進化について、わかりやすく解説します。


1. 匿名メソッドとは?

C#では、関数に名前を付けずにその場で定義したい場面があります。  

そんなときに使われるのが「匿名メソッド(anonymous method)」です。

● 匿名メソッドの登場(C# 2.0)

Func<int, int> square = delegate(int x)
{
    return x * x;
};
Console.WriteLine(square(5)); // 出力: 25
  • delegate キーワードで無名関数を定義。
  • メソッド名が不要なときに使います。
  • クロージャ(外部変数の利用)も可能。

● LINQと合わせるとこうなる

var even = numbers.Where(delegate(int n)
{
    return n % 2 == 0;
});

読みづらさ冗長さが目立ちます。


2. ラムダ式の登場(C# 3.0)

● より簡潔に書ける表現

Func<int, int> square = x => x * x;
Console.WriteLine(square(5)); // 出力: 25
  • => は「goes to」(〜に対応する)と読みます。
  • 引数戻り値の式だけで書ける。
  • 型推論により int を省略できる場面が増えます。

● LINQとの親和性が高い

var even = numbers.Where(n => n % 2 == 0);
  • n => n % 2 == 0 は Func<int, bool> に推論されます。
  • 直感的で読みやすい。

3. 匿名メソッドとラムダ式の違いまとめ

項目匿名メソッドラムダ式
導入バージョンC# 2.0C# 3.0
書き方delegate(引数) { 本体 }引数 => 式 または { 本体 }
型推論×(明示が必要)○(ほとんどの場合省略可能)
簡潔さ△(やや冗長)◎(非常に簡潔)
クロージャ○(可能)○(可能)
デバッグのしやすさ○(VSで個別にブレーク可能)△(短すぎると困難なことも)

4. なぜラムダ式が主流になったのか?

  • コードが短くなる
  • 読みやすい
  • LINQなどの記述に自然に組み込める
  • デリゲート型にそのまま渡せる

つまり、「関数を値として扱う文脈」において、ラムダ式は理想的な表現方法なのです。


5. 使い分けのポイント

  • ラムダ式で書ける場面は ほとんどラムダ式でOK
  • ローカル関数や名前付きメソッドの方が読みやすく・再利用しやすいなら、無理にラムダにしない
  • ブロック構文 { … } を使えば、複数文のラムダ式も書けます
Action<string> sayHello = name =>
{
    Console.WriteLine("こんにちは!");
    Console.WriteLine($"ようこそ、{name}さん");
};

おわりに

C# の進化とともに、コードの表現力も高まっています。

匿名メソッドはその先駆けであり、ラムダ式はその完成形と言えるでしょう。

今後も「関数を値として渡す」スタイルはさらに重要になります。

その第一歩として、ラムダ式を自在に使えるようになることが、現代の C# プログラマーに求められています。


練習問題(初学者向け)

  1. 次の匿名メソッドをラムダ式に書き換えてみよう:
Func<int, bool> isEven = delegate(int n)
{
    return n % 2 == 0;
};
Func<int, bool> isEven = n => n % 2 == 0;

訪問数 6 回, 今日の訪問数 1回