Metody nie akceptują parametrów lambdas. Przyjmują delegatów jako parametry.Lambda to tylko jeden sposób na stworzenie delegata.
Innym sposobem jest dostarczenie grupy metod, tak jak w drugim przykładzie, który można przekonwertować na delegata.
Podobny sposób polega na użyciu funkcji anonimowej metody. Zostało to mniej więcej zastąpione lambdami, gdy zostały dodane, więc nie widzisz tego zbyt wiele. Twój przykład za pomocą tej składni byłoby:
Func<char, bool> predicate = delegate(char c) { return Char.IsDigit(c); };
Jeszcze innym sposobem byłoby stworzenie delegata korzystając Delegate.CreateDelegate
. (To nie jest coś, co widzisz bardzo często.)
Ostatnim sposobem jest mieć zmienną delegata, którą otrzymałeś z innego miejsca. (To gdzieś indziej stworzyli delegata przy użyciu jednego z tych innych opcji.)
Co się dzieje w tym drugim fragmencie, gdzie metoda Char.IsDigit() jest (podobno) jest zwany z niejawny parametr? Jak nazywa się ta składnia?
To nie jest ani. O to chodzi. Próbujemy utworzyć delegata. Delegat to obiekt, który śledzi metodę, która ma zostać wywołana, oraz obiekt, na którym powinien się on uruchamiać. Następnie możesz wywołać delegata i wywołać metodę, która została użyta do jego utworzenia. Więc jesteś nie dzwoniąc pod numer IsDigit
, tworzysz delegata, który wskazuje na metodę IsDigit
i będzie ją wywoływać za każdym razem, gdy delegat zostanie wywołany.
Kiedy używasz lambdy, tworzysz nową metodę, prawdopodobnie w nowej klasie (z których żadna nie ma nazwy, do której możesz się odnosić, ale będzie miała jedną w środowisku wykonawczym) i treść tego anonimowego metoda zadzwoni pod numer IsDigit
. Następnie lambda przechodzi do delegata wskazującego na tę anonimową metodę, która zachowuje semantykę innego przykładu posiadania metody, która po wywołaniu wywołuje anonimową metodę, która w swojej implementacji wywołuje IsDigit
. Dodaje dodatkową warstwę pośrednią (która może, ale nie musi być po prostu zoptymalizowana w czasie wykonywania), aby osiągnąć to samo.
ReSharper sugeruje również uproszczoną składnię, jeśli dotyczy. –
Niż to już nie jest wyrażenie lambda, ale przekazanie delegata jako argumentu innej metody. –
Patrzysz na * grupę metod *. –