【C#】ラムダ式と匿名メソッドの違いと使い分け

C# ではメソッドを名前を付けずに定義できる「匿名メソッド」や「ラムダ式」を使うことができます。どちらも一時的な処理を簡潔に書くために利用されますが、記法や使い勝手に違いがあります。本記事では、ラムダ式と匿名メソッドの違いと、実際の使い分けのポイントを解説します。

匿名メソッドとは?

匿名メソッドは delegate キーワードを使って定義する無名メソッドです。C# 2.0 で導入されました。

using System;

class Program
{
    static void Main()
    {
        // 匿名メソッド
        Action greet = delegate(string name)
        {
            Console.WriteLine($"Hello, {name}");
        };

        greet("Taro"); // 出力: Hello, Taro
    }
}

delegate キーワードを使って、メソッドをその場で定義して代入できます。

ラムダ式とは?

ラムダ式は匿名メソッドをさらに簡潔に書ける構文で、C# 3.0 から導入されました。=> 演算子を使い、より読みやすく記述できます。

using System;

class Program
{
    static void Main()
    {
        // ラムダ式
        Action<string> greet = name => Console.WriteLine($"Hello, {name}");

        greet("Hanako"); // 出力: Hello, Hanako
    }
}

ラムダ式は処理が1行であれば波括弧も省略でき、非常にシンプルに書けます。

匿名メソッドとラムダ式の違い

項目 匿名メソッド ラムダ式
導入バージョン C# 2.0 C# 3.0
記法 delegate キーワードを使用 => 演算子を使用
可読性 やや冗長 シンプルで見やすい
機能的な違い
  • ref / out パラメータを利用できる
  • 複雑な処理に使いやすい
  • LINQ との相性が良い
  • 式形式でより直感的に記述できる

使い分けのポイント

  • ラムダ式: 簡潔に処理を書きたいとき、LINQ やイベント処理で多用される
  • 匿名メソッド: refout を使いたい場合、または読みやすさのために delegate を明示したい場合

実用例:LINQでの利用

using System;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4, 5 };

        // ラムダ式
        var evens = numbers.Where(n => n % 2 == 0);

        Console.WriteLine(string.Join(", ", evens)); // 2, 4
    }
}

LINQ ではラムダ式が主流です。短く直感的に記述できるため、可読性が高くなります。

まとめ

匿名メソッドとラムダ式はどちらも「名前を付けないメソッド」を定義する仕組みですが、現在の C# では ラムダ式が主流 です。匿名メソッドは特別な理由(ref/out の利用など)がある場合に限って使うケースが多いです。基本的にはラムダ式を使うことで、モダンで読みやすいコードが書けます。