你的例子中的主要區別是將要執行的方法的結構。在第一種情況:
- timer.Tick + =新的EventHandler(timer_Tick); //事件
方法timer_Tick
看起來是這樣的:
public void timer_Tick(object sender, EventArgs e)
{
}
,所以你可以使用參數object sender
和EventArgs e
。你在這裏實際做的是調用EventHandler
的構造函數,並將一個委託/指針傳遞給它。
雖然這種結構是由Tick
屬性在第二種情況下給出:
- timer.Tick + =代表{/ 對蜱執行我的操作/ }; //匿名方法
您創建一個匿名方法,實際上隱藏與委託關鍵字參數,你必須對他們的訪問權限。此外,您將無法從其他地方調用此方法。你不能模擬事件的觸發,你不能重用代碼。
在這裏,你可以使用lambda表達式實際指定參數,這樣就可以訪問它們:
timer.Tick += (s, e) => { };
第三種情況:
timer.Tick + = Timer_Tick;
是第一種情況的簡短版本。在這裏,Visual Studio會爲您推導出正確的方法結構,而無需指定事件的類型。如果您執行的方法Timer_Tick
與Tick
所要求的結構不匹配,編譯器會發出抱怨!
實施例:
委託Tick
是EventHandler類型。這些類型指定了我在上面第一種情況下編寫的結構,您將在文檔中看到它。如果(如圖所示)代表Tick
的結構和Timer_Tick
方法的結構不匹配,則會出現錯誤。請注意,在此表達:
timer.Tick += Timer_Tick;
Timer_Tick
僅僅是一個代表/中實現的指針方法問題其中有!
對於委託和事件之間的根本差異,請看看this article和this acticle
我不認爲有區別。這隻取決於方法體和您的偏好。如果你想把處理程序內聯,把它放在內聯。請注意,您也可以使用lambdas。 – Sweeper
[我只是把它放在這裏](https://stackoverflow.com/q/29155/1849444)。 –