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

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

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

Пример:

int sum = 0;
list.ForEach(_=> { sum += 1; });

Ответ 1

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

Ответ 2

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

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

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

var _ = 10;

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

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

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

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

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

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