2017-08-17 107 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

    相關問題