Jest to znacznie bardziej zwięzła forma zapisu metod. Poniższe są z grubsza równoważne:
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;
Wyobraź sobie wyrażenie lambda jako mówiące „daj coś, zwróć coś”. W powyższym przykładzie wyrażenie lambda x => xmówi „dane x, zwróć x”, chociaż wyrażenia lambda niekoniecznie muszą coś zwracać, w takim przypadku możesz je odczytać jako „dane x, zrób coś z x”.
Zauważ również, że istnieją trzy rzeczy zwane „delegatem”, które na początku mogą być bardzo mylące.
Metoda anonimowa używa delegatesłowa kluczowego, ale definiuje metodę bez nazwy:
Func<int, int> = delegate (int x) { return x; };
Przypisanie metody (anonimowej, jawnej lub lambda) do odwołania powoduje utworzenie ukrytego Delegateobiektu opakowującego, który umożliwia odwołanie się do metody. (Zasadniczo rodzaj „wskaźnika funkcji zarządzanej”).
Następnie możesz również zadeklarować podpisy nazwanych metod, używając delegatesłowa kluczowego:
public delegate int TestFunc(int x, int y);
TestFunc myFunc = delegate (int x, int y) { return x + y; };
To deklaruje nazwany podpis, TestFuncktóry przyjmuje dwa ints i zwraca int, a następnie deklaruje odwołanie do delegata tego typu, do którego jest następnie przypisywana metoda anonimowa z pasującym podpisem.