Справочник по C#. Оператор delegate

Оператор delegate создает анонимный метод, который можно преобразовать в тип делегата:

Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

Примечание

Начиная с C# 3, лямбда-выражения позволяют быстрее и проще создавать анонимные функции. С помощью оператора => создайте лямбда-выражение:

Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4));  // output: 7

См. подробнее о возможностях лямбда-выражений (например, об использовании внешних переменных).

При использовании оператора delegate вам, возможно, нужно будет пропустить список параметров. В таком случае созданный анонимный метод можно будет преобразовать в тип делегата с любым списком параметров, как показано в примере ниже:

Action greet = delegate { Console.WriteLine("Hello!"); };
greet();

Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);

// Output:
// Hello!
// This is world!

Это единственная функция анонимных методов, которая не поддерживается лямбда-выражениями. Во всех остальных случаях лямбда-выражение является предпочтительным способом написания встроенного кода.

Начиная с C# 9.0, можно использовать отмены, чтобы указать два или более входных параметра анонимного метода, которые не используются методом:

Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4));  // output: 42

Если только один параметр имеет имя _, для обеспечения обратной совместимости _ рассматривается как имя этого параметра в анонимном методе.

Кроме того, начиная с C# 9.0 можно использовать модификатор static в объявлении анонимного метода:

Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4));  // output: 14

Статический анонимный метод не может записывать локальные переменные или состояние экземпляра из охватывающих областей.

Вы также можете использовать ключевое слово delegate для объявления типа делегата.

Спецификация языка C#

Дополнительные сведения см. в разделе Выражения анонимных функций в спецификации языка C#.

См. также