定义事件处理程序

时间:2009-12-06 21:27:34

标签: .net events delegates lambda

我可以定义这样的事件(声明的函数):

MyElement.Keyup +=MyDeclaredFunction

我也可以这样定义(匿名委托):

MyElement.Keyup+=new delegate(object sender, eventargs e) {};

我也可以像这样定义它(lambda):

MyElement.Keyup += (sender, e) => myfunction

最好的方法是什么?一个案例是事件的代码与事件的声明一起找到...在另一个事件中它们是分开的。

我更喜欢方法1

谁能告诉我每种方法的优点和缺点是什么?

3 个答案:

答案 0 :(得分:3)

方法2和3是相同的。

在方法1中,您可以稍后取消订阅活动。在方法2中,您无法取消订阅活动。我会说这是主要区别。

答案 1 :(得分:2)

第一个对于非平凡的代码量是有用且正常的,或者您想要重用代码的地方(可以通过捕获到变量中使用匿名方法执行此操作,但它失去光泽......)

第二个和第三个在很大程度上是相同的(至少在C#3.0中),并且对于短代码块非常方便。实际上,有一个第四个选项,如果你不关心args是有用的:

MyElement.Keyup+= delegate { /* code */ };

请注意,我们不必声明任何args(编译器会编写一个不使用它们的兼容签名)。上面的技巧对于Click事件来说可能很方便(我猜测KeyUp你对哪个键被按下感兴趣,所以可能使用这个在你的场景中。)

答案 2 :(得分:2)

我喜欢在附加到事件时使用附加/分离模式,只要我知道我需要在我的代码中稍后取消订阅事件。

除非我们将匿名方法或lambdas分配给委托变量,否则使用labdas和匿名方法不允许我们这样做。

我想说在(1)中使用decalration的专家是该方法将在您的类中的其他地方声明,这使得开发人员可以轻松地“扫描”您的代码并发现事件处理程序方法,而匿名方法和lambdas可以在需要它们的地方声明,如果没有读取声明它们的方法代码,它可能并不明显。