Jestem ciekawy różnic między bezpośrednim wywołaniem Func a użyciem na nim Invoke (). Czy jest jakaś różnica? Czy pierwszy to cukier składniowy i wywołuje Invoke () pod spodem?
public T DoWork<T>(Func<T> method)
{
return (T)method.Invoke();
}
vs
public T DoWork<T>(Func<T> method)
{
return (T)method();
}
Czy też jestem na złej drodze :) Dzięki.
Odpowiedzi:
Nie ma żadnej różnicy. Drugi jest tylko skrótem
Invoke
, dostarczonym przez kompilator. Kompilują się do tego samego IL.źródło
(T)method
raczej wrócić niż(T)method()
.foo()
ifoo.Invoke()
gdziefoo
jest zmienną typu delegata. Innym problemem jest to, że odpowiedź wydaje się mówićControl.Invoke
, co nie jest tym samym, co wezwanieInvoke
delegata.Invoke
, boGetAction()()
wygląda dziwnie, aleGetAction().Invoke()
wygląda dobrze. Ale w większości nie mam nic przeciwko temu.Invoke działa dobrze z nowym operatorem propagacji wartości null w języku C # 6, teraz możesz to zrobić
zamiast
T result = method != null ? method() : null;
źródło
+=
. Więc jeśli masz zamiar uruchomić wydarzenie i nie wiesz, czy są jakieś subskrypcje, zwięzłym rozwiązaniem jest zadzwonić?.Invoke(...)
.