在c#中创建事件和匿名方法之间的区别

时间:2017-08-17 06:19:39

标签: c# events anonymous-function

在我的c#winform中,我正在使用Timer。

  Timer timer = new Timer(); 

对于Timer的tick事件,我们可以从两种方式中选择。

1. timer.Tick += new EventHandler(timer_Tick); //event
2. timer.Tick += delegate {/*to perform my operations on tick*/}; //anonymous method

任何人都可以告诉我这两者之间的区别吗?

也可以是第三种类型:

timer.Tick += Timer_Tick;

会有什么不同吗?

3 个答案:

答案 0 :(得分:1)

您的示例中的主要区别是将要执行的方法的结构。在第一种情况下:

  
      
  1. timer.Tick + = new EventHandler(timer_Tick); //事件
  2.   

方法timer_Tick如下所示:

public void timer_Tick(object sender, EventArgs e)
{

}

因此您可以使用参数object senderEventArgs e。你在这里实际做的是调用EventHandler的构造函数,并将一个委托/指针传递给它。

虽然在第二种情况下Tick属性给出了这种结构:

  
      
  1. timer.Tick + =委托{/ 在刻度线上执行我的操作 /}; //匿名方法
  2.   

您创建了一个匿名方法,实际上使用delegate关键字隐藏了该参数,并且您无权访问它们。此外,您将无法从其他地方调用此方法。您无法模拟事件的触发,也无法重用代码。

在这里,您可以使用lambda表达式来实际指定参数,以便您可以访问它们:

timer.Tick += (s, e) => { };

第三种情况:

  

timer.Tick + = Timer_Tick;

是第一个案例的简短版本。在这里,Visual Studio将为您推断出方法的正确结构,而无需指定事件的类型。如果您实现的方法Timer_TickTick所要求的结构不匹配,编译器会抱怨!

示例:

enter image description here

代理人Tick的类型为EventHandler。这种类型指定了我在上面第一种情况下编写的结构,您将在文档中看到它。如果(如图所示)委托Tick的结构与Timer_Tick方法的结构不匹配,则表示您有错误。请注意,在此表达式中:

timer.Tick += Timer_Tick;

Timer_Tick只是一个委托/指向有问题的方法的指针,必须实现!

有关代表和活动之间的根本差异,请查看this articlethis acticle

答案 1 :(得分:0)

一个区别就是可重用性。也就是说,如果您选择使用处理程序方法timer_Tick,那么您可以重复使用相同的处理程序方法来处理其他类似的事件,如果您使用匿名方法或lambda表达式,则不能这样做。

答案 2 :(得分:0)

无法取消订阅(删除)匿名方法。因为这对事件使用匿名方法非常糟糕。这可能会导致内存泄漏!