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.0 | C# 3.0 |
書き方 | delegate(引数) { 本体 } | 引数 => 式 または { 本体 } |
型推論 | ×(明示が必要) | ○(ほとんどの場合省略可能) |
簡潔さ | △(やや冗長) | ◎(非常に簡潔) |
クロージャ | ○(可能) | ○(可能) |
デバッグのしやすさ | ○(VSで個別にブレーク可能) | △(短すぎると困難なことも) |
4. なぜラムダ式が主流になったのか?
- コードが短くなる
- 読みやすい
- LINQなどの記述に自然に組み込める
- デリゲート型にそのまま渡せる
つまり、「関数を値として扱う文脈」において、ラムダ式は理想的な表現方法なのです。
5. 使い分けのポイント
- ラムダ式で書ける場面は ほとんどラムダ式でOK
- ローカル関数や名前付きメソッドの方が読みやすく・再利用しやすいなら、無理にラムダにしない
- ブロック構文 { … } を使えば、複数文のラムダ式も書けます
Action<string> sayHello = name =>
{
Console.WriteLine("こんにちは!");
Console.WriteLine($"ようこそ、{name}さん");
};
おわりに
C# の進化とともに、コードの表現力も高まっています。
匿名メソッドはその先駆けであり、ラムダ式はその完成形と言えるでしょう。
今後も「関数を値として渡す」スタイルはさらに重要になります。
その第一歩として、ラムダ式を自在に使えるようになることが、現代の C# プログラマーに求められています。
練習問題(初学者向け)
- 次の匿名メソッドをラムダ式に書き換えてみよう:
Func<int, bool> isEven = delegate(int n)
{
return n % 2 == 0;
};
Func<int, bool> isEven = n => n % 2 == 0;
訪問数 6 回, 今日の訪問数 1回
ディスカッション
コメント一覧
まだ、コメントがありません