_ => что означает это подчеркивание в лямбда-выражениях? - PullRequest
99 голосов
/ 06 мая 2010

Что означает лямбда-выражение типа _=> expr?

Какова цель _ в качестве ввода в лямбду?

Пример:

int count = 0;
list.ForEach(_ => count += 1);

Ответы [ 5 ]

72 голосов
/ 06 мая 2010

Это соглашение используется, когда вас не волнует параметр.

38 голосов
/ 06 мая 2010

Это имя параметра, хотя и не полезное, но оно обычно используется (по некоторым соглашениям), когда вам нужно указать, что выражение имеет параметр, чтобы получить код для компилировать, но вас это не волнует, поэтому вы просто проигнорируете это.

В основном он использует синтаксис того, что составляет юридический идентификатор в C #, и, поскольку идентификатор может начинаться с подчеркивания и не содержать ничего другого, это просто имя параметра.

Вы могли бы просто написать:

var _ = 10;
27 голосов
/ 06 мая 2010

_ - допустимое имя переменной. Они просто используют _ в качестве переменной.

9 голосов
/ 06 мая 2010

Поскольку лямда-выражение в основном используется в коротком анонимном коде, поэтому имя переменной иногда не обязательно, даже если они не используют переменную в блоке кода, так что они просто дают _ для краткости,конвенция

5 голосов
/ 23 января 2017

Я также поддерживаю использование _ => _.method() для однострочных лямбд-вызовов методов, поскольку это уменьшает когнитивный вес инструкции. Особенно при использовании обобщений, написание x => x.method() просто добавляет доли секунды, что такое «что это за x? Это координата в пространстве?».

Рассмотрим следующий случай:

Initialize<Client> ( _=>_.Init() );

Используется с вызовом Generics, подчеркивание в этом случае работает как «символ обхода». Это позволяет избежать избыточности, определяя, что тип аргумента очевиден и может быть получен из использования - так же, как когда вы используете 'var', чтобы предотвратить повторение объявления типа. Запись client=>client.Init() просто увеличит длину инструкции, не добавляя к ней никакого смысла.

Очевидно, что это не относится к параметрам, передаваемым методу, которые должны быть названы описательно. Например: Do( id=>Log(id) );

Использование одного параметра подчеркивания для вызовов методов вряд ли оправдано при использовании блока кода вместо однострочного, поскольку лямбда-идентификатор отсоединяется от своего определения обобщенного типа. В общем случае, когда один и тот же идентификатор должен использоваться повторно, присвойте ему описательное имя.

Суть в том, что многословие оправдано только для устранения неоднозначности, особенно для лямбд, которые были созданы, чтобы в первую очередь упростить создание анонимных делегатов. В любом случае следует использовать здравый смысл, уравновешивая разборчивость и лаконичность. Если символ является всего лишь «зацепкой» к реальной функциональности, идентификаторы одного символа вполне подойдут. Это относится и к циклам For, и к буквам «i» и «j» в качестве индексаторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...