Estilo de C#: Lambdas, => o x=>? [cerrado]


He usado expresiones lambda en otros lenguajes antes de usarlas en C#, así que me acostumbré a usar _ para lambdas simples en la forma de Func<T, TResult>, especialmente para lambdas simples donde el cuerpo es solo una expresión que representa el valor de retorno (predicados, etc.)..). Sin embargo, en C# a menudo veo que se usan letras individuales en lugar de _ para este mismo tipo de expresiones lambda, como x,y,z,i,j,k. El enfoque de letras me parece extraño ya que esas letras ya tienen otro típico significado en uso común, para variables de bucle. _ es a menudo más fácil de leer en mi opinión. ¿Es el estilo de letra única realmente el estilo establecido para lambdas en C#?

Ejemplos:

Lo que estoy acostumbrado a escribir:

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

Lo que estoy viendo escrito en su lugar:

var ages = people.Select(x => x.Age); // choice of 'x' is not consistent
Author: Soner Gönül, 2012-05-10

7 answers

Muchos desarrolladores de C# usan _ para indicar que el parámetro no se va a usar y una letra u otro nombre corto cuando se usa el parámetro .

Otros recursos:

 47
Author: sblom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 17:04:41

Es un nombre de variable, así que me gustaría ir con la idea de que el nombre debe transmitir la información que necesita transmitir. ¿Qué información transmite _?

Con ese mismo fin, ¿qué información transmite x?

Podría escribir su ejemplo así:

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

La idea es que siento que el p al menos sugiere en el contexto de toda la declaración que es un registro people. Usted podría llevarlo aún más lejos:

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

Ahora que transmite para el lector lo que realmente es esa variable. Por supuesto, para una declaración tan pequeña, se puede argumentar que es exagerado. No lo creo, pero es una cuestión de preferencias. (Y no solo su preferencia, sino la preferencia de cualquiera que tenga que soportar este código.)

Para expresiones lambda complejas, multilíneas y significativamente más grandes, el nombre se vuelve aún más importante. Cuanto más lejos uno está del contexto de lo que significa la variable, más el nombre de la variable necesita llevar ese contexto con él.

 23
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 17:08:28

Cómo es una función lambda tan diferente de cualquier otro método. Si alguien fuera a código postal con un método como:

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

O

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

¿Qué dirías?

En mi opinión, elegir el nombre de un parámetro para una lambda debería ser tan significativo como el parámetro de cualquier otro método. Podría hacer excepciones ocasionales para una función de identidad x => x porque en ese caso la variable no necesita significar nada, realmente puede ser cualquier cosa, pero usando un el subrayado o una sola letra para todo en mi mente hace que el código sea mucho menos legible. (Mucha gente promociona las ventajas de LINQ / Lambdas como legibilidad, que es derrotada si ofuscas todas las variables.)

 17
Author: Servy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 17:26:18

O podría usar un nombre significativo, por ejemplo,

var ages = people.Select(person => person.Age);
 5
Author: Danny Varod,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 17:06:29

En C#, _ se usa para variables de clase(atributo) y _ no se usa para variables locales. Por lo tanto, es bueno usar un nombre significativo para las variables locales y la variable de clase.

Ex:

var personList = (from person in people  where person.Age > 18  select person).ToList();
 1
Author: stay_hungry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-13 13:48:27

No hay un estilo 'establecido' para nombrar sus variables lambda. Sin embargo, un subrayado normalmente significa algún tipo de variable miembro de instancia, lo que significa que su estilo podría entrar en conflicto con otros estándares de nomenclatura en comparación con un nombre de variable normal.

Long Story Short - Haz lo que funciona para ti.

 0
Author: Tejs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 17:05:10

Hay una razón por la que puedes darle un nombre because porque a veces puedes tener múltiples entradas y necesitas diferenciarlas:

Func<int,int,int> product = (num1, num2) => (num1 * num2);  // takes in two ints, and returns one int
int x = product(2, 3);  
 0
Author: BeemerGuy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-10 17:12:47