C#9: Незначительные Улучшения в Лямбдах
В C#9 лямбда-функции получат два обновления. Ни одно из них не изменит способ написания кода, но они помогут разработчику прояснить свои намерения.
Дискард-Параметры Лямбда Функций
Позволят разработчикам явно указать, что некоторые параметры не нужны, что предотвратит ошибочные предупреждения компилятора о неиспользуемых параметрах. Это может быть полезно, например, в обработчиках событий, когда не нужны параметры
sender и eventArgs:button1.Click += (s, e) => ShowDialog();
Замена параметров, как показано ниже, позволит явно указать, что они не используются:
button1.Click += (_, _) => ShowDialog();
При необходимости могут быть использованы типы:
var handler = (object _, EventArgs _) => ShowDialog();
Статические Анонимные Функции
Будут использоваться, чтобы обозначить, что лямбда или анонимная функция не может захватывать локальные переменные (включая параметры). Вот пример из оригинального предложения функционала:
int y = 10;
someMethod(x => x + y);
//захватывает 'y', приводя к неявному выделению памяти
Проблема в том, что это неявно приводит к увеличению времени жизни локальной переменной, т.к. анонимная функция может существовать дольше, чем окружающий её метод.
Чтобы избежать случайного захвата любого локального состояния при предоставлении лямбда-функций в качестве аргумента метода, предлагается добавить к лямбда-объявлению ключевое слово
static. Это сделает лямбда-функцию похожей на статический метод, который не может захватывать локальные объекты и не имеет доступа к this или base:int y = 10;
someMethod(static x => x + y); //ошибка!
Чтобы исправить эту ошибку, переменная y должна быть изменена на константу или статическое поле:
const int y = 10;
someMethod(static x => x + y);
Вот основные правила для статических анонимных функций:
- может ссылаться на статические члены из окружающего кода;
- может ссылаться на определения констант из окружающего кода;
- не может захватывать состояние из окружающего кода, т.е. локальные объекты, параметры и
this из окружающего кода недоступны;- не может ссылаться на экземплярные члены окружающего её класса;
-
nameof() внутри статической анонимной функции может ссылаться на локальные объекты, параметры, this или base из окружающего кода.Источник: https://www.infoq.com/news/2020/07/CSharp-Lambdas/