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 => x
mó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 delegate
sł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 Delegate
obiektu 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 delegate
słowa kluczowego:
public delegate int TestFunc(int x, int y);
TestFunc myFunc = delegate (int x, int y) { return x + y; };
To deklaruje nazwany podpis, TestFunc
który przyjmuje dwa int
s 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.