我可以定义这样的事件(声明的函数):
MyElement.Keyup +=MyDeclaredFunction
我也可以这样定义(匿名委托):
MyElement.Keyup+=new delegate(object sender, eventargs e) {};
我也可以像这样定义它(lambda):
MyElement.Keyup += (sender, e) => myfunction
最好的方法是什么?一个案例是事件的代码与事件的声明一起找到...在另一个事件中它们是分开的。
我更喜欢方法1
谁能告诉我每种方法的优点和缺点是什么?
答案 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可以在需要它们的地方声明,如果没有读取声明它们的方法代码,它可能并不明显。