2010-06-05 24 views
13

Soy nuevo en C# y antes vi la expresión lambda es comoC# Sintaxis de expresión lambda: ¿son necesarios los paréntesis?

(params) => { expression;} 

pero en LINQ, vi ejemplos como

IEnumerable<string> customerFirstNames = customers.Select(cust => cust.FirstName); 

No hay soportes.

¿Son iguales o hay alguna diferencia?

Muchas gracias.

+0

¿Se refiere a aparatos ortopédicos, soportes o ambos? Muchas interpretaciones: http://en.wikipedia.org/wiki/Bracket Lista de argumentos, cuerpo del código o ambos (toda la expresión? –

+12

'{}' son llaves, '()' son paréntesis, y '[]' son corchetes (en el lenguaje de programación). – Donnie

+0

Lo siento, no estaba claro acerca de los diferentes significados de las palabras llaves, paréntesis y corchetes. En realidad me refería a {} y() – LLS

Respuesta

23

Las reglas son:

Una expresión lambda tiene la forma

(modifier type parameter, modifier type parameter ...) => { statements } 

Primero veamos el lado izquierdo.

El modificador puede ser ref, out o nada en absoluto.

Si no hay modificadores ref o out, se pueden eludir todos los tipos. Si hay cualquier ref o modificadores entonces cada declaración de parámetro debe tener un tipo declarado.Si cualquier parámetro tiene un tipo declarado, entonces cada parámetro debe tener un tipo declarado. Por lo tanto, puede elide los tipos siempre que (1) no haya referencias o salidas, y (2) elide todos de ellos. De lo contrario, debe proporcionar todos los tipos.

Si hay exactamente un parámetro y su tipo ha sido elidido, entonces los paréntesis alrededor de la lista de parámetros pueden ser también eliminados.

Estas son todas las reglas sobre las listas de parámetros. Las reglas sobre el lado derecho son:

si la lista de sentencias consiste en una sola instrucción de retorno con una expresión:

x => { return x + 1; } 

continuación, las llaves, la palabra clave de retorno y coma pueden elided:

x => x + 1 

Además, si la lista de instrucciones consta de una sola declaración que es una expresión de extracto:

x => { x++; } // Not returning the value of x++; only useful for the side effects 
x => { new Y(x); } // weird! executing a ctor only for its side effects! But legal! 
x => { M(x); } // note, not returning the value of M(x) even if there is one. 

entonces también es legal para eludir los aparatos ortopédicos y coma:

x => x++ 
x => new Y(x) 
x => M(x) 

Tenga en cuenta que estos ahora potencialmente significan algo diferente para el lector! Antes estábamos claramente descartando los valores de retorno; ahora las lambdas se leerán como devolviéndolas.

Tenga en cuenta que esto significa que es legal hacer este truco con los métodos de devolución de nulo. Esto es realmente legal:

x => Console.WriteLine(x) 

Yuck. No hagas eso. Si se refiere a

x => { Console.WriteLine(x); } 

diga que en su lugar. El primero parece demasiado como si estuvieras tratando de decir

x => { return Console.WriteLine(x); } 

que, por supuesto, sería ilegal.

+0

+1 para aplicar llaves alrededor de los métodos de devolución de vacío. Iría tan lejos como para decir que si el propósito principal de llamar al método es crear un efecto secundario, póngalo entre llaves para que se vea más claro. –

+0

Explicación muy detallada. Muchas gracias. – LLS

+1

¿significaría esto que consideraría que alguien que escribe un método tomando una Expresión está haciendo algo que fomenta la codificación deficiente? No es que lo haya hecho alguna vez, pero la pregunta me vino a la cabeza cuando escribí esto. – ShuggyCoUk

5

Solo necesita paréntesis si tiene varios parámetros.

actualización (Como es habitual en SO cuando las respuestas son editados después de que otras personas han respondido ...)

El uso de corchetes (paréntesis "()" y llaves "{}") es este caso son redundantes . Las declaraciones son equivalentes. Un complemento de Visual Studio en como ReSharper apuntará redundancias como esto:

http://www.jetbrains.com/resharper/

15

Qué soportes se está hablando? () o {}?


() se utilizan en la lista de parámetros y son necesarios cuando se tiene más de un parámetro:

(a, b, c) => ... 

puede omitirse cuando sólo tiene un argumento:

a => ... 

{} al baja a poner un bloque de declaraciones en el cuerpo de las expresiones lambda:

(a, b, c) => { 
       Console.WriteLine("Hello World!"); 
       Console.WriteLine("a = {0}", a); 
       Console.WriteLine("b = {0}", b); 
       Console.WriteLine("c = {0}", c); 
       return a * b + c; 
      } 

Sin ellos, el cuerpo de una expresión lambda es un expresión:

(a, b, c) => a * b + c 
+0

¿Su ejemplo habla de llaves en lugar de corchetes? –

+0

Gracias, eso explica mucho. – LLS

Cuestiones relacionadas