Мне любопытно узнать о различиях между прямым вызовом Func и использованием на нем Invoke (). Есть разница? Является ли первый синтаксический сахар и в любом случае вызывает Invoke () внизу?
public T DoWork<T>(Func<T> method)
{
return (T)method.Invoke();
}
против
public T DoWork<T>(Func<T> method)
{
return (T)method();
}
Или я совершенно ошибаюсь :) Спасибо.
Ответы:
Вообще нет никакой разницы. Второй - это просто сокращение
Invoke
, предоставленное компилятором. Они компилируются в один и тот же IL.источник
(T)method
а не(T)method()
.foo()
иfoo.Invoke()
гдеfoo
- переменная типа делегата. Другая проблема заключается в том, что ответ, похоже, говорит о томControl.Invoke
, что это не то же самое, что вызовInvoke
делегата.Invoke
, так какGetAction()()
выглядит странно, ноGetAction().Invoke()
выглядит нормально. Но я в любом случае не возражаю, по большей части.Invoke хорошо работает с новым оператором нулевого распространения C # 6, теперь вы можете
вместо
T result = method != null ? method() : null;
источник
+=
. Поэтому, если вы собираетесь запустить событие и не знаете, есть ли какие-либо подписки, краткое решение - позвонить?.Invoke(...)
.