Ответ 1
Многие разработчики С# используют _
, чтобы указать, что параметр не будет использоваться, и буква или другое сокращенное имя при использовании параметра.
Другие ресурсы:
Я использовал лямбда-выражения на других языках, прежде чем использовать их в С#, и поэтому я привык использовать _
для простых лямбда в форме Func<T, TResult>,
, особенно для простых лямбда, где тело - это просто выражение, представляющее возвращаемое значение (предикаты и т.д.). Однако в С# я часто вижу одиночные буквы вместо _
для этих же лямбда-выражений, например x,y,z,i,j,k
. Буквенный подход кажется мне странным, поскольку эти буквы уже имеют другой типичный смысл в общем использовании, для переменных цикла. _
часто легче читать по моему мнению. Является ли стиль одной буквы действительно установленным стилем для lambdas в С#?
Примеры:
что я привык писать:
var ages = people.Select(_ => _.Age);
Что я вижу вместо этого:
var ages = people.Select(x => x.Age); // choice of 'x' is not consistent
Многие разработчики С# используют _
, чтобы указать, что параметр не будет использоваться, и буква или другое сокращенное имя при использовании параметра.
Другие ресурсы:
Это переменное имя, поэтому я бы подумал, что имя должно передавать информацию, которую он должен передать. Какую информацию передает _
?
К тому же концу какая информация передает x
?
Я мог бы написать ваш пример следующим образом:
var ages = people.Select(p => p.Age);
Идея состоит в том, что я чувствую, что p
по крайней мере предлагает в контексте всего утверждения, что это запись people
. Вы можете принять это еще дальше:
var ages = people.Select(person => person.Age);
Теперь это передает читателю, что такое эта переменная. Разумеется, для такого небольшого заявления можно сделать аргумент, что он излишне. Я так не думаю, но это вопрос предпочтения. (И не только ваше предпочтение, но предпочтение любого, кто должен поддерживать этот код.)
Для значительно больших, многострочных, сложных лямбда-выражений имя становится еще более важным. Чем дальше от контекста того, что означает переменная, тем больше имя переменной должно переносить этот контекст с ней.
Как лямбда-функция отличается от любого другого метода. Если кто-то должен был отправить код с помощью метода, например:
public static int getAge(Person _)
{
return _.Age;
}
или
public static int getAge(Person x)
{
return x.Age;
}
Что бы вы сказали?
По-моему, выбор имени параметра для лямбда должен быть столь же значимым, как и параметр любого другого метода. Я мог бы делать случайные исключения для функции идентификации x => x
, потому что в этом случае переменная не должна означать ничего, она действительно может быть чем угодно, но с использованием подчеркивания или одной буквы для всего, что мне кажется, просто делает код, который гораздо менее читаемым. (Так много людей рекламируют преимущества LINQ/Lambdas как читаемость, которые побеждают, если вы запутываете все переменные.)
Или вы можете использовать значащее имя, например.
var ages = people.Select(person => person.Age);
В С# для переменных класса (атрибута) используется _
, а _
не используется для локальных переменных.
Поэтому полезно использовать значащее имя для локальных переменных и переменной класса.
Пример:
var personList = (from person in people where person.Age > 18 select person).ToList();
Существует не установленный стиль для обозначения ваших лямбда-переменных. Тем не менее, подчеркивание обычно означает какую-то переменную члена экземпляра, что означает, что ваш стиль может конфликтовать с другими стандартами именования по сравнению с обычным именем переменной.
Long Story Short. Делайте то, что работает для вас.
Есть причина, по которой вы можете назвать это имя, потому что иногда вы можете иметь несколько входов и их нужно различать:
Func<int,int,int> product = (num1, num2) => (num1 * num2); // takes in two ints, and returns one int
int x = product(2, 3);