2009-12-06 119 views
4

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

MyElement.Keyup +=MyDeclaredFunction 

我还可以定义它像这样(匿名委托):

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

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

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

这样做的最好方法是什么?一个事件的代码是在事件声明中找到的......在另一个事件中它们是分离的。

我宁愿方法1

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

回答

3

方法2和3是相同的。

在方法1,您可以稍后从事件退订。在方法2中,您不能退订事件。我会说这是主要的区别。

+3

退订:不正确;您可以取消订阅匿名代表。你甚至可以让它自我取消订阅。您只需要将代理首先捕获到变量中。一行额外的代码。 – 2009-12-06 21:38:53

2

首先是不平凡的代码量,有用和正常或要重复使用的代码(你可以通过捕捉到一个变量匿名方法做到这一点,但它有点失去光泽...)

第二和第三大部分相同(在C#3.0,至少),且可用于代码短块确实方便。其实,如果你不关心ARGS有一个第四选项,有用:

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

注意,我们还没有宣布任何ARGS(编译写道,只是不使用它们兼容签名)。上述伎俩可能是MOT得心应手Click事件(我猜的KeyUp你有兴趣,其中一个键被按下,所以大概使用这一块您的方案)。

2

我宁愿连接到事件的时候,我知道我需要在我的代码一些稍后从事件退订使用安装/拆卸模式。

使用labdas和匿名方法不允许我们,除非我们分配的匿名方法或lambda表达式委托变量做到这一点。

我会说在(1)中使用decalration的一个亲是该方法将在你的类中的其他地方声明,这使得开发人员可以“扫描”你的代码并发现事件处理程序方法,而匿名方法和lambda表达式可以在需要的地方进行声明,如果不读取声明它们的方法代码,它可能并不明显。