2012-04-04 49 views
1

什麼是註冊一個事件作爲的好處:什麼是註冊一個事件處理程序的好處隱含

void MyMethod() 
{ 
    button1.Click += delegate (object sender, EventArgs e) 
    { 
     .. 
    } 
} 

與比較:

void MyMethod() 
{ 
    button1.Click += new System.EventHandler(this.button1_Click); 
} 

void button1_Click(object sender, EventArgs e) 
{ 
    .. 
} 

UPDATE: 又是怎麼回事取消訂閱它?

回答

2

好處是你不必在課堂上想出一個名字和一個地方。

對於輕功能,緊密耦合到註冊事件的代碼,短版本更方便。

請注意,您也可以爲=>

button1.Click += (object sender, EventArgs e) => 
{ 
    .. 
} 
+0

那麼取消註冊呢? – Mimi 2012-04-04 06:48:35

+1

如果你需要取消註冊(大多數處理程序不需要),那麼這是使用命名方法的一個很好的理由。 – 2012-04-04 06:51:29

+0

我找到了[這裏](http://stackoverflow.com/q/183367/668342);) – Mimi 2012-04-08 05:16:47

1

這只是編碼風格。

值得注意的是,在第一種情況下聲明它可以讓您避免「意大利麪代碼」並以更自然(人類可讀的方式)注入處理函數局部變量(如果需要)。

要更清楚。在你可以先寫的情況下,如:

int x = 0; 

System.Windows.Forms.Button button = new System.Windows.Forms.Button(); 
button.Click += (o,e)=> { 
++x; 
}; 

裏面的事件處理程序可以訪問聲明實際上出於對處理方法的範圍局部變量。對大多數人來說,這似乎是「自然的」,但如果你像一個開發人員那樣思考,就不應該這樣做。

祝你好運。

3

交換delegate你可以更簡潔:

button1.Click += (sender, e) => 
{ 
}; 

在語法上是清潔的(只要它不會導致長塊的代碼將更好地分解成命名方法)。

內聯聲明是一個閉包,它使您可以訪問與匿名方法相鄰的變量。

來自:What are 'closures' in .NET?

在本質上,一個封閉件是可在一個 稍後的時間被執行的代碼的塊,但其保持在其被第一環境 創建 - 即它可以仍使用創建它的方法 的局部變量等,即使在該方法執行完畢後。

參見:http://csharpindepth.com/articles/chapter5/closures.aspx

+0

+1感謝您的提示。 – Mimi 2012-04-08 05:18:32

2

註冊時使用匿名委託或lambda事件處理程序,你可以寫短代碼,並使用閉。 但是您不能取消訂閱該事件,並且如果事件處理程序代碼太長,則您的代碼變得很難看。

相關問題