2008-11-14 21 views
56

Acabo de presentar esta sintaxis en algunas de las preguntas de este foro, pero Google y cualquier otro motor de búsqueda tiende a bloquear todo menos letras y números en la búsqueda, por lo que es imposible buscar "=>".¿Qué significa la sintaxis '=>' en C#?

Entonces, ¿alguien puede decirme qué es y cómo se usa?

+0

posible duplicado de [C# expresión Lambda, ¿por qué debería usar esto?] (http://stackoverflow.com/questions/167343/c-sharp-lambda-expression-why-should-i-use-this) – nawfal

Respuesta

66

Es el operador lambda.

De C# 3 a C# 5, esto solo se usó para lambda expressions. Estos son básicamente una forma más corta del anonymous methods introducido en C# 2, pero también se puede convertir en expression trees.

A modo de ejemplo:

Func<Person, string> nameProjection = p => p.Name; 

es equivalente a:

Func<Person, string> nameProjection = delegate (Person p) { return p.Name; }; 

En ambos casos se está creando un delegado con un parámetro Person, volviendo el nombre de esa persona (como una cadena).

En C# 6 se usa la misma sintaxis para miembros con cuerpo de expresión, p. Ej.

// Expression-bodied property 
public int IsValid => name != null && id != -1; 

// Expression-bodied method 
public int GetHashCode() => id.GetHashCode(); 

Consulte también:

(y de hecho muchas preguntas similares - tratan los lambda y lambda-expressions las etiquetas.)

+0

Dado que la pregunta no dice nada sobre el caso exacto sobre el que se pregunta, quizás considere actualizar esta respuesta para contener la nueva sintaxis del miembro cuerpo de expresión también? –

+0

@ LasseV.Karlsen: Claro, haré ... –

+0

Bonito :) Acabo de llegar aquí porque esta pregunta se usó como un objetivo para el cierre duplicado, por lo que pensé que sería bueno tener 1 respuesta en lugar de ir a la caza de un diferente uno en esos otros casos :) –

2

En lugar de utilizar método anónimo de esta manera:

somevar.Find(delegate(int n) 
{ 
    if(n < 10) 
     return n; 
}); 

, se escribe así:

somevar.Find(n => n < 10); 

Se tomará el tipo de datos basado en el valor de retorno.

0

Básicamente significa "entra en", como un parámetro

MyObjectReference => MyObjectReference.DoSomething() 

Por lo general, los utiliza para pasar funciones en métodos como parámetros, o en las declaraciones de LINQ

MyCollection.Where(myobj => myobj.Age>10) 

Por ejemplo.

14

Significa genialidad. Por ej.

x => x + 1 

representa un método que toma x como parámetro y devuelve su sucesor.

button.Click += new EventHandler((sender, e) => methodInfo.Invoke(null, new object[] { sender, e })); 

asigna un controlador de eventos a un botón invocando un método que contiene una MethodInfo.

7

aquí es un ejemplo sencillo de MSDN

delegate int del(int i); 
del myDelegate = x => x * x; 
int j = myDelegate(5); //j = 25 

Cualquier cosa antes de que el => son los parámetros de entrada, y nada después es la expresión. Puede tener múltiples parámetros de entrada. Lambdas se utilizan principalmente con Linq.

0

Forma parte de la sintaxis de una expresión lambda. Una expresión lambda es esencialmente una forma abreviada de un delegado o de un método anónimo. Para ilustrar, supongamos que tengo una matriz de cadenas que coinciden con las letras del alfabeto. Pude elegir los miembros de esa matriz que contenían valores mayores que "E" con la siguiente expresión LINQ:

var someLetters = alphabet.Where (l => l> "E");

La parte de la expresión lambda a la izquierda de "=>" identifica el nombre de la variable para la prueba (que se establece en los miembros individuales del alfabeto) y la parte de la expresión lambda a la derecha de " => "identifica el procesamiento. En este caso, el procesamiento produce un valor booleano que usa la lógica Where para determinar si cada miembro del alfabeto se pasa a la matriz someLetters.

7

Es otra forma de notación de función. Los siguientes son aproximadamente equivalentes:

// explicit function 
int MyFunc(int pParam) 
{ 
    return pParam; 
} 

// delegate function 
Func<int, int> MyFunc = delegate(int pParam) { return pParam; }; 

// lambda expression 
Func<int, int> MyFunc = x => x; 

Piense en una expresión lambda diciendo: "algo dado, devuelva algo". En el ejemplo anterior, la función x => x dice "dado x, retorno x". (Aunque las expresiones lambda no necesitan necesariamente devolver algo, en cuyo caso puede leerlas como "x dado, hacer algo con x".)