【发布时间】:2012-11-05 21:15:10
【问题描述】:
我们什么时候应该使用Action<T>而不是明确定义委托?
谢谢
【问题讨论】:
标签: c# delegates design-choices
我们什么时候应该使用Action<T>而不是明确定义委托?
谢谢
【问题讨论】:
标签: c# delegates design-choices
嗯……
Action<T> is almost the same as delegate void (T t)
and
Func<T> is almost the same as delegate T ()
Action 和 Func(和 lambdas)只是“语法糖”,方便使用委托。
所以这实际上只是一个偏好问题。
【讨论】:
Action<T> 的逆变。如果不需要逆变,请编写您自己的不带逆变的委托类型。请参阅我对 Servy 的回答的评论。
这完全是一个偏好问题,但是如果 Action 或 Func 的重载之一可以工作,我认为没有理由定义自己的委托。如果您有 ref/out/params 参数、可选参数或其他一些此类边缘情况,您别无选择,只能自己定义。
【讨论】:
Action<in T> 在T 中是逆变。但同时,委托组合(两个委托对象的“加法”)不适用于逆变(Lippert 的话:all messed up)。所以假设你创建了一个public event Action<string> ItHappened;。然后由于逆变,一个订阅者可以添加一个Action<object> 到ItHappened,另一个是Action<IConvertible>,第三个是Action<ICloneable>。在运行时抛出!所以使用用户定义类型的一个原因是不具有逆变性。