Анонимные функции (Руководство по программированию в C#)

Обновлен: Ноябрь 2007

Как описано в других разделах, делегат — это тип, создающий оболочку вызова метода. Экземпляр делегата можно подставлять между методами как тип и вызывать как метод. Анонимная функция – это оператор или выражение "inline", которое можно использовать каждый раз, когда ожидается тип делегата. Ее можно использовать для инициализации именованного делегата или подставить вместо типа именованного делегата в качестве параметра метода.

Существует два типа анонимных функций, каждый из которых по отдельности рассматривается в следующих разделах:

Эволюция делегатов в C#

В языке C# 1.0 разработчик создавал экземпляр делегата путем его явной инициализации с методом, определенным в каком-либо месте кода. В C# версии 2.0 представлена концепция анонимных методов, которые позволяют писать блоки неименованных встраиваемых выражений, которые можно выполнять в вызове делегата. В языке C# версии 3.0 представлены лямбда-выражения, концепция которых соответствует анонимным методам, но которые являются более выразительными и лаконичными. Две эти возможности вместе называются анонимными функциями. В общем, в приложениях для среды .NET Framework версии 3.5 и более новой версии должны использоваться лямбда-выражения.

В приведенном ниже примере демонстрируется эволюция создания делегата в языке C# с версии 1.0 до версии 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 Анонимные функции

См. также

Основные понятия

Деревья выражений

Ссылки

Операторы и выражения (Руководство по программированию на C#)

Делегаты (руководство по программированию на C#)