Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Оператор 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 слово также используется для объявления типа делегата.
Компилятор может кэшировать объект делегата, созданный из группы методов. Рассмотрим следующий метод.
static void StaticFunction() { }
При назначении группы методов делегату компилятор кэширует делегат:
Action a = StaticFunction;
Спецификация языка C#
Дополнительные сведения см. в разделе Анонимные выражения функций спецификации языка C#.