匿名関数 (C# プログラミング ガイド)
更新 : 2007 年 11 月
他のトピックで説明しているように、デリゲートはメソッド呼び出しをラップする型です。デリゲート インスタンスは型と同様にメソッド間で渡すことができ、メソッドのように呼び出すことができます。匿名関数は、デリゲート型になるところであればどこでも使用できる "インライン" ステートメントまたは式です。これを使用すると、名前付きデリゲートの初期化や、名前付きデリゲート型の代わりにメソッド パラメータとして渡すことができます。
匿名関数には 2 種類あり、次のトピックでそれぞれ個別に説明しています。
-
メモ : ラムダ式は、式ツリーのほかにデリゲートにもバインドできます。
C# におけるデリゲートの進化
C# 1.0 では、コードの他の場所で定義されたメソッドを使用して明示的に初期化することにより、デリゲートのインスタンスを作成していました。C# 2.0 で匿名メソッドの概念が導入され、デリゲート呼び出しで実行できる名前のないインライン ステートメント ブロックを作成できるようになりました。C# 3.0 ではラムダ式が導入されました。ラムダ式は匿名メソッドと似た概念ですが、表現できる範囲が広がり、より簡潔になりました。この 2 つの機能を総称して匿名関数と言います。一般に、Version 3.5 以降の .NET Framework を対象とするアプリケーションは、ラムダ式を使用する必要があります。
次の例は、C# 1.0 から C# 3.0 までのデリゲート作成の進化を示しています。
class Test
{
delegate void TestDelegate(string s);
static void M(string s)
{
Console.WriteLine(s);
}
static void Main(string[] args)
{
// Original delegate syntax required
// initialization with a named method.
TestDelegate testdelA = new TestDelegate(M);
// C# 2.0: A delegate can be initialized with
// inline code, called an "anonymous method." This
// method takes a string as an input parameter.
TestDelegate testDelB = delegate(string s) { Console.WriteLine(s); };
// C# 3.0. A delegate can be initialized with
// a lambda expression. The lambda also takes a string
// as an input parameter (x). The type of x is inferred by the compiler.
TestDelegate testDelC = (x) => { Console.WriteLine(x); };
// Invoke the delegates.
testdelA("Hello. My name is M and I write lines.");
testDelB("That's nothing. I'm anonymous and ");
testDelC("I'm a famous author.");
// Keep console window open in debug mode.
Console.WriteLine("Press any key to exit.");
Console.ReadKey();
}
}
/* Output:
Hello. My name is M and I write lines.
That's nothing. I'm anonymous and
I'm a famous author.
Press any key to exit.
*/
C# 言語仕様
詳細については、「C# 言語仕様」の次のセクションを参照してください。
- 5.3.3.29 匿名関数