Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Оператор delegate
создает анонимный метод, который можно преобразовать в тип делегата. Анонимный метод можно преобразовать в типы, такие как System.Action и System.Func<TResult> типы, используемые в качестве аргументов во многих методах.
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
Замечание
Лямбда-выражения предоставляют более краткий и экспрессивный способ создания анонимной функции. Используйте оператор => для создания лямбда-выражения:
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!
Это единственная функция анонимных методов, которые не поддерживаются лямбда-выражениями. Во всех остальных случаях лямбда-выражение является предпочтительным способом написания встроенного кода. С помощью отмены можно указать два или более входных параметров анонимного метода, который не используется методом:
Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4)); // output: 42
Для обратной совместимости, если только один параметр называется _
, _
рассматривается как имя этого параметра в анонимном методе.
Модификатор можно использовать static
в объявлении анонимного метода:
Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4)); // output: 14
Статический анонимный метод не может записывать локальные переменные или состояние экземпляра из вложенных областей.
Ключевое delegate
слово также используется для объявления типа делегата.
Начиная с C# 11 компилятор может кэшировать объект делегата, созданный из группы методов. Рассмотрим следующий метод.
static void StaticFunction() { }
При назначении группы методов делегату компилятор кэширует делегат:
Action a = StaticFunction;
Перед C# 11 необходимо использовать лямбда-выражение для повторного использования одного объекта делегата:
Action a = () => StaticFunction();
Спецификация языка C#
Дополнительные сведения см. в разделе Анонимные выражения функций спецификации языка C#.