你的例子中的主要区别是将要执行的方法的结构。在第一种情况:
- timer.Tick + =新的EventHandler(timer_Tick); //事件
方法timer_Tick
看起来是这样的:
public void timer_Tick(object sender, EventArgs e)
{
}
,所以你可以使用参数object sender
和EventArgs e
。你在这里实际做的是调用EventHandler
的构造函数,并将一个委托/指针传递给它。
虽然这种结构是由Tick
属性在第二种情况下给出:
- timer.Tick + =代表{/ 对蜱执行我的操作/ }; //匿名方法
您创建一个匿名方法,实际上隐藏与委托关键字参数,你必须对他们的访问权限。此外,您将无法从其他地方调用此方法。你不能模拟事件的触发,你不能重用代码。
在这里,你可以使用lambda表达式实际指定参数,这样就可以访问它们:
timer.Tick += (s, e) => { };
第三种情况:
timer.Tick + = Timer_Tick;
是第一种情况的简短版本。在这里,Visual Studio会为您推导出正确的方法结构,而无需指定事件的类型。如果您执行的方法Timer_Tick
与Tick
所要求的结构不匹配,编译器会发出抱怨!
实施例:
委托Tick
是EventHandler类型。这些类型指定了我在上面第一种情况下编写的结构,您将在文档中看到它。如果(如图所示)代表Tick
的结构和Timer_Tick
方法的结构不匹配,则会出现错误。请注意,在此表达:
timer.Tick += Timer_Tick;
Timer_Tick
仅仅是一个代表/中实现的指针方法问题其中有!
对于委托和事件之间的根本差异,请看看this article和this acticle
我不认为有区别。这只取决于方法体和您的偏好。如果你想把处理程序内联,把它放在内联。请注意,您也可以使用lambdas。 – Sweeper
[我只是把它放在这里](https://stackoverflow.com/q/29155/1849444)。 –