看着下面这两句事件定义及激发忽然有点不明白了,
public event EventHandler<ExternalDataEventArgs> Submit;
Submit(null, args);
貌似该事件定义时只传一个参数args, 但实际激发时要传两个参数, 咋回事捏!
其实, 这是误解, 这个EventHandler<ExternalDataEventArgs>是个泛型版的预定义委托, 该委托实际的定义如下:
public delegate void EventHandler<TEventArgs> (
Object sender,
TEventArgs e
) where TEventArgs : EventArgs
而非泛型版的定义如下:
public delegate void EventHandler (
Object sender,
EventArgs e
)
这样就明白了, 事件确实是需要两个参数.
推荐资料: .NET Framework委托的预定义方法介绍
http://webservices.ctocio.com.cn/net/430/9352430.shtml
此文中这段甚对, "从.NET Framework2.0开始以来,系统预定义的委托使使代码看起来有点像“天书”,再加上匿名表达式,以及后面Lambda表达式的“掺和”,代码就更加难懂了."
因此,多梳理,多熟悉一下才行。
类似的预定义委托还有:
1.Action 封装1-16个参数, 无返回值.
public delegate void Action<in T>(
T obj
)
public delegate void Action<in T1, in T2>(
T1 arg1,
T2 arg2
)
2.Func 封装1-16个参数, 返回值TResult.
public delegate TResult Func<out TResult>(
)
public delegate TResult Func<in T, out TResult>(
T arg
)
3.Predicate 表示定义一组条件并确定指定对象是否符合这些条件的方法。
public delegate bool Predicate<in T>(
T obj
)
推荐资料:
EventHandler 泛型委托
http://msdn.microsoft.com/zh-cn/library/db0etb8x(v=VS.80).aspx
Action<T> 委托
http://msdn.microsoft.com/zh-cn/library/018hxwa8.aspx
Func<TResult> 委托
http://msdn.microsoft.com/zh-cn/library/bb534960.aspx
Predicate<T> 委托
http://msdn.microsoft.com/zh-cn/library/bfcke1bz(v=VS.100).aspx