【问题标题】:Func<T>() vs Func<T>.Invoke()Func<T>() 与 Func<T>.Invoke()
【发布时间】:2013-04-30 21:30:54
【问题描述】:

我很好奇直接调用Func&lt;T&gt; 与在其上使用Invoke() 之间的区别。有区别吗?无论如何,第一个语法糖和调用Invoke()

public T DoWork<T>(Func<T> method)
{
    return (T)method.Invoke();
}

对比

public T DoWork<T>(Func<T> method)
{
    return (T)method();
}

还是我完全走错了路?

【问题讨论】:

标签: c# invoke func


【解决方案1】:

根本没有区别。第二个只是编译器提供的Invoke 的简写。它们编译成相同的 IL。

【讨论】:

  • 关闭 Invoke() 方法会导致编译器错误:“无法将类型 'System.Func' 隐式转换为 'T'”。我正在针对 .NET 4 进行编译。
  • @Mike:如果您也错过了 方括号,就会发生这种情况 - 即尝试返回 (T)method 而不是 (T)method()
  • @JonSkeet 这家伙错了吗:social.msdn.microsoft.com/Forums/en-US/…
  • @superlogical:这里有两个问题。首先,问题在于直接调用方法和通过委托调用方法之间的区别。这与foo()foo.Invoke() 之间的区别不同,其中foo 是委托类型的变量。另一个问题是 answer 似乎在谈论 Control.Invoke,这与在代表上调用 Invoke 不同。
  • @LucaCremonesi:如果是方法调用的结果,我一般喜欢Invoke,因为GetAction()() 看起来很奇怪,但GetAction().Invoke() 看起来不错。但在大多数情况下,我不介意任何一种方式。
【解决方案2】:

Invoke 可以很好地与新的 C# 6 空传播运算符配合使用,现在您可以这样做了

T result = method?.Invoke();

而不是

T result = method != null ? method() : null;

【讨论】:

  • 你能举例说明一个有用的场景吗?教科书案例正在引发事件。
  • 例如,您可以有一个可选的 Func 参数,如果没有分配值,则为默认值(Func),该参数为 null 并被忽略。
  • 这是事件和其他多播委托的常见情况 - 它们通常用 null 初始化并在调用 += 后获得非 null 值。因此,如果您要触发一个事件并且不知道是否有任何订阅,简洁的解决方案是调用?.Invoke(...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
相关资源
最近更新 更多