Что означает выражение лямбда, например _=> expr
?
Какова цель _
в качестве входа в лямбда?
Пример:
int sum = 0;
list.ForEach(_=> { sum += 1; });
Что означает выражение лямбда, например _=> expr
?
Какова цель _
в качестве входа в лямбда?
Пример:
int sum = 0;
list.ForEach(_=> { sum += 1; });
Это соглашение используется, когда вам не нужен параметр.
Это имя параметра, хотя и не полезно, но оно обычно используется (по некоторым соглашениям), когда вам нужно указать, что выражение имеет параметр, чтобы получить код для компиляции, но вы не знаете, я действительно забочусь об этом, поэтому вы просто проигнорируете его.
В основном он использует синтаксис для того, что представляет собой юридический идентификатор в С#, и поскольку идентификатор может начинаться с подчеркивания и не содержать ничего другого, это просто имя параметра.
Вы могли бы просто написать:
var _ = 10;
_
- допустимое имя переменной. Они просто используют _
как переменную.
Поскольку выражение lamda в основном используется в коротком анонимном коде, так что имя переменной иногда не обязательно, даже они не используют переменную в блоке кода, так что они просто дают _ для короткого, конвенции
Я также использую _ => _.method()
для однострочного, lambdas метода-вызова, поскольку он уменьшает когнитивный вес команды. Специально при использовании дженериков запись x => x.method()
просто добавляет, что разделенное второе рассмотрение "Что это" x "? Это координата в пространстве?".
Рассмотрим следующий случай:
Initialize<Client> ( _=>_.Init() );
Используется с вызовом Generics, подчеркивание в этом случае работает как символ обхода. Это позволяет избежать избыточности, определяя, что тип аргумента является очевидным и может быть выведен из использования - так же, как при использовании "var", чтобы предотвратить повторение объявления типа. Написание client=>client.Init()
здесь просто сделает инструкцию длиннее, не добавляя к ней никакого смысла.
Очевидно, что это не относится к параметрам, которые должны быть переданы методу, который следует называть дескриптивно. Например: Do( id=>Log(id) );
Использование однонаправленного параметра для вызовов методов вряд ли оправдано при использовании блока кода вместо однострочного, поскольку идентификатор лямбда отключается от определения своего дженериков. В общем случае, когда один и тот же идентификатор должен использоваться повторно, дайте ему описательное имя.
Суть в том, что многословие является оправданным только для значений, особенно для лямбда, которые были созданы для упрощения создания анонимных делегатов. В любом случае следует использовать здравый смысл, балансируя четкость и краткость. Если символ является только "крюком" для реальной функциональности, то один идентификатор персонажа отлично работает. Это случай с For-loops и буквы "i" и "j" в качестве индексаторов.