Es una forma mucho más concisa de notación de método. Los siguientes son aproximadamente equivalentes:
int MyFunc(int pParam) {
return pParam;
}
Func<int, int> MyFunc = delegate (int pParam) { return pParam; };
Func<int, int> MyFunc = x => x;
int MyFunc(int pParam) =>
pParam;
Piense en una expresión lambda como si dijera "dado algo, devolver algo". En el ejemplo anterior, la expresión lambda x => xdice "dado x, devuelve x", aunque las expresiones lambda no necesariamente tienen que devolver algo, en cuyo caso podrías leerlas como "dado x, haz algo con x".
También tenga en cuenta que hay tres cosas llamadas "delegar" que pueden ser muy confusas al principio.
Un método anónimo usa la delegatepalabra clave, pero define un método sin nombre:
Func<int, int> = delegate (int x) { return x; };
Asignar un método (anónimo, explícito o lambda) a una referencia hace Delegateque se cree un objeto contenedor oculto que es lo que permite hacer referencia al método. (Básicamente, una especie de "puntero de función administrada").
Y luego, también puede declarar firmas de métodos nombrados usando la delegatepalabra clave también:
public delegate int TestFunc(int x, int y);
TestFunc myFunc = delegate (int x, int y) { return x + y; };
Esto declara una firma con nombre TestFuncque toma dos intsy devuelve an int, y luego declara una referencia delegada de ese tipo a la que luego se le asigna un método anónimo con una firma coincidente.