匿名函数 -(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.

可以使用 lambda 表达式匿名方法来创建匿名函数。You can use a lambda expression or an anonymous method to create an anonymous function. 建议使用 lambda 表达式,因为它们提供了更简洁和富有表现力的方式来编写内联代码。We recommend using lambda expressions as they provide more concise and expressive way to write inline code. 与匿名方法不同,某些类型的 lambda 表达式可以转换为表达式树类型。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 引入了 lambda 表达式,这种表达式与匿名方法的概念类似,但更具表现力并且更简练。C# 3.0 introduced lambda expressions, which are similar in concept to anonymous methods but more expressive and concise. 这两个功能统称为匿名函数These two features are known collectively as anonymous functions. 通常,面向 .NET Framework 3.5 及更高版本的应用程序应使用 lambda 表达式。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