Подтвердить что ты не робот

Стиль С#: Lambdas, _ => или x =>?

Я использовал лямбда-выражения на других языках, прежде чем использовать их в С#, и поэтому я привык использовать _ для простых лямбда в форме 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
4b9b3361

Ответ 2

Это переменное имя, поэтому я бы подумал, что имя должно передавать информацию, которую он должен передать. Какую информацию передает _?

К тому же концу какая информация передает x?

Я мог бы написать ваш пример следующим образом:

var ages = people.Select(p => p.Age);

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

var ages = people.Select(person => person.Age);

Теперь это передает читателю, что такое эта переменная. Разумеется, для такого небольшого заявления можно сделать аргумент, что он излишне. Я так не думаю, но это вопрос предпочтения. (И не только ваше предпочтение, но предпочтение любого, кто должен поддерживать этот код.)

Для значительно больших, многострочных, сложных лямбда-выражений имя становится еще более важным. Чем дальше от контекста того, что означает переменная, тем больше имя переменной должно переносить этот контекст с ней.

Ответ 3

Как лямбда-функция отличается от любого другого метода. Если кто-то должен был отправить код с помощью метода, например:

public static int getAge(Person _)
{
  return _.Age;
}

или

public static int getAge(Person x)
{
  return x.Age;
}

Что бы вы сказали?

По-моему, выбор имени параметра для лямбда должен быть столь же значимым, как и параметр любого другого метода. Я мог бы делать случайные исключения для функции идентификации x => x, потому что в этом случае переменная не должна означать ничего, она действительно может быть чем угодно, но с использованием подчеркивания или одной буквы для всего, что мне кажется, просто делает код, который гораздо менее читаемым. (Так много людей рекламируют преимущества LINQ/Lambdas как читаемость, которые побеждают, если вы запутываете все переменные.)

Ответ 4

Или вы можете использовать значащее имя, например.

var ages = people.Select(person => person.Age);

Ответ 5

В С# для переменных класса (атрибута) используется _, а _ не используется для локальных переменных. Поэтому полезно использовать значащее имя для локальных переменных и переменной класса.

Пример:

var personList = (from person in people  where person.Age > 18  select person).ToList();

Ответ 6

Существует не установленный стиль для обозначения ваших лямбда-переменных. Тем не менее, подчеркивание обычно означает какую-то переменную члена экземпляра, что означает, что ваш стиль может конфликтовать с другими стандартами именования по сравнению с обычным именем переменной.

Long Story Short. Делайте то, что работает для вас.

Ответ 7

Есть причина, по которой вы можете назвать это имя, потому что иногда вы можете иметь несколько входов и их нужно различать:

Func<int,int,int> product = (num1, num2) => (num1 * num2);  // takes in two ints, and returns one int
int x = product(2, 3);