2017-08-17 53 views
1

在我的C#winform中,我使用Timer。在c#中创建一个事件和匿名方法之间的区别#

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; 

会不会有什么区别?

+1

我不认为有区别。这只取决于方法体和您的偏好。如果你想把处理程序内联,把它放在内联。请注意,您也可以使用lambdas。 – Sweeper

+1

[我只是把它放在这里](https://stackoverflow.com/q/29155/1849444)。 –

回答

1

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

  1. timer.Tick + =新的EventHandler(timer_Tick); //事件

方法timer_Tick看起来是这样的:

public void timer_Tick(object sender, EventArgs e) 
{ 

} 

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

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

  • timer.Tick + =代表{/ 对蜱执行我的操作/ }; //匿名方法
  • 您创建一个匿名方法,实际上隐藏与委托关键字参数,你必须对他们的访问权限。此外,您将无法从其他地方调用此方法。你不能模拟事件的触发,你不能重用代码。

    在这里,你可以使用lambda表达式实际指定参数,这样就可以访问它们:

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

    第三种情况:

    timer.Tick + = Timer_Tick;

    是第一种情况的简短版本。在这里,Visual Studio会为您推导出正确的方法结构,而无需指定事件的类型。如果您执行的方法Timer_TickTick所要求的结构不匹配,编译器会发出抱怨!

    实施例:

    enter image description here

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

    timer.Tick += Timer_Tick; 
    

    Timer_Tick仅仅是一个代表/中实现的指针方法问题其中有!

    对于委托和事件之间的根本差异,请看看this articlethis acticle

    +0

    那么第三种情况呢? – Arc

    +0

    @Arc这是凌晨,我不是当前最快的作家;) –

    +0

    @Arc第三个案例加入 –

    0

    好一个差将可重用性。也就是说,如果您选择使用处理程序方法timer_Tick,那么您可以重新使用相同的处理程序方法来处理其他类似的事件,如果您使用的是匿名方法或lambda表达式,则无法处理。

    +0

    @ Rahul,这三个都一样吗?唯一的区别是可重用性? – Arc

    0

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

    +0

    @ WhileTrueSleep,对,如果它导致内存泄漏,那么它可能是应用程序的严重问题。 – Arc

    相关问题