読者です 読者をやめる 読者になる 読者になる

それ,名前のあるメソッドで書けるよ

.NET

最終回 小さな改善とコンパイラの新機能、そして3.0への展望 - 連載:C# 2.0入門 - @IT』より.

例えば、次のリスト3のSortメソッドとForEachメソッドの引数は匿名メソッドである。

using System;
using System.Collections.Generic;

class Program
{
  static void Main(string[] args)
  {
    List<int> list = new List<int>();
    list.Add(1);
    list.Add(3);
    list.Add(2);

    list.Sort(delegate(int x, int y) // 匿名メソッド
    {
      return x - y;
    });

    list.ForEach(delegate(int i) // 匿名メソッド
    {
      Console.WriteLine(i);
    });
    // 出力:
    // 1
    // 2
    // 3
  }
}
リスト3 匿名メソッドの使用例

この2つのメソッドの引数をC# 3.0のラムダ式で書き直すと以下のようになる。

list.Sort( (x, y) => x - y );
list.ForEach( i => Console.WriteLine(i) );
リスト4 リスト3のSortメソッドとForEachメソッドをラムダ式に置き換えた例

(中略)

匿名メソッドに比べれば、まさに圧倒的な短さだ。これならば、整数や文字列に近い気軽さで、いくらでもコードの断片を記述することができる。もはや、こう書いたらよいのではないか、あるいは書くべきであるというレベルではない。そう書くのが当たり前という前提で、気軽に書けるように構文が拡張されている。

主張はごもっともですが,例がちょっとちぐはぐな.というかこのコードバグありますよね?
例のようなコードだと,C# 3.0 を待つまでもなく,以下のコードに落ち着いてしまうので,そもそもラムダ式の出番が無かったり.

// C# 2.0
list.Sort(Comparer<int>.Default.Compare);
list.ForEach(Console.WriteLine);

ちなみに、

PersonCreator creator = new PersonCreator(Target);

という式は、VS.NET 2003でも構文エラーにしないためにこのように記述しているが、VS 2005では、

PersonCreator creator = Target;

で構わない。

余談

List のソートは以下のようにも書けます.

list.Sort();
// or
list.Sort(Comparer<int>.Default);

ソースコードを追いかけられる人 は動作を比べてみると面白いかも.結構えぐい最適化やってますな.