【问题标题】:When should we use Action<T> and not create a custom delegate [closed]我们什么时候应该使用 Action<T> 而不是创建自定义委托 [关闭]
【发布时间】:2012-11-05 21:15:10
【问题描述】:

我们什么时候应该使用Action&lt;T&gt;而不是明确定义委托?

谢谢

【问题讨论】:

标签: c# delegates design-choices


【解决方案1】:

嗯……

Action<T> is almost the same as delegate void (T t)
and
Func<T> is almost the same as delegate T ()

Action 和 Func(和 lambdas)只是“语法糖”,方便使用委托。

所以这实际上只是一个偏好问题。

【讨论】:

  • 感谢分享
  • @amitkohan 是的,几乎一样。要注意的一件事是Action&lt;T&gt; 的逆变。如果不需要逆变,请编写您自己的不带逆变的委托类型。请参阅我对 Servy 的回答的评论。
【解决方案2】:

这完全是一个偏好问题,但是如果 Action 或 Func 的重载之一可以工作,我认为没有理由定义自己的委托。如果您有 ref/out/params 参数、可选参数或其他一些此类边缘情况,您别无选择,只能自己定义。

【讨论】:

  • 其他:由于 .NET 4.0,Action&lt;in T&gt;T 中是逆变。但同时,委托组合(两个委托对象的“加法”)不适用于逆变(Lippert 的话:all messed up)。所以假设你创建了一个public event Action&lt;string&gt; ItHappened;。然后由于逆变,一个订阅者可以添加一个Action&lt;object&gt;ItHappened,另一个是Action&lt;IConvertible&gt;,第三个是Action&lt;ICloneable&gt;。在运行时抛出!所以使用用户定义类型的一个原因是具有逆变性。
  • 虽然使用 Action/Func 生活要容易得多,但自定义委托可以为您提供更好的类型安全性(正确性)。最后有一个取舍。另一个好处是更好(更有意义)的参数名称和 IDE 的文档支持。
猜你喜欢
  • 1970-01-01
  • 2011-09-11
  • 2016-04-19
  • 2014-04-06
  • 2011-01-25
  • 2011-01-07
  • 2017-07-16
  • 2014-05-07
  • 2011-03-21
相关资源
最近更新 更多