匿名関数 (C# プログラミング ガイド)Anonymous functions (C# Programming Guide)

匿名関数は、デリゲート型が必要とされる任意の場所で使用できる "インライン" のステートメントまたは式です。An anonymous function is an "inline" statement or expression that can be used wherever a delegate type is expected. 名前付きデリゲートを初期化するときや、メソッドのパラメーターとして名前付きデリゲート型の代わりに渡したりするときに使用できます。You can use it to initialize a named delegate or pass it instead of a named delegate type as a method parameter.

ラムダ式または匿名メソッドを使って匿名関数を作成できます。You can use a lambda expression or an anonymous method to create an anonymous function. ラムダ式を使った方がより簡潔で表現性に優れた方法でインライン コードを記述できるため、こちらを使うことをお勧めします。We recommend using lambda expressions as they provide more concise and expressive way to write inline code. 匿名メソッドとは異なり、一部の型のラムダ式は式ツリー型に変換することができます。Unlike anonymous methods, some types of lambda expressions can be converted to the expression tree types.

C# のデリゲートの進化The Evolution of Delegates in C#

C# 1.0 では、コードのどこかで定義したメソッドを使用して明示的に初期化することで、デリゲートのインスタンスを作成していました。In C# 1.0, you created an instance of a delegate by explicitly initializing it with a method that was defined elsewhere in the code. C# 2.0 では、デリゲートの呼び出しで実行できる名前なしのインライン ステートメント ブロックを記述する方法として、匿名メソッドの概念が導入されました。C# 2.0 introduced the concept of anonymous methods as a way to write unnamed inline statement blocks that can be executed in a delegate invocation. C# 3.0 では、ラムダ式が導入されました。ラムダ式は、概念的には匿名メソッドと似ていますが、より表現力が豊かで簡潔です。C# 3.0 introduced lambda expressions, which are similar in concept to anonymous methods but more expressive and concise. これら 2 つの機能は総称として匿名関数と呼ばれます。These two features are known collectively as anonymous functions. 一般的に、バージョン 3.5 以降の .NET Framework をターゲットとするアプリケーションであれば、ラムダ式を使用することが推奨されます。In general, applications that target version 3.5 and later of the .NET Framework should use lambda expressions.

次の例は、C# 1.0 から C# 3.0 のデリゲート作成の進化を示しています。The following example demonstrates the evolution of delegate creation from C# 1.0 to 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# language specification

詳細については、「C# 言語仕様」の無名関数の式に関するセクションを参照してください。For more information, see the Anonymous function expressions section of the C# language specification.

関連項目See also