2011-03-23 129 views
2

當我處理設置的事件,我通常寫成這樣:C#處理事件

data.event += new data.returndataeventhandler(method); 

而且有一個方法,例如:

void method(parameter) 
{ 
    dosomething(); 
} 

這是當事件返回一個對象。

我剛纔已通過偷別人的讀碼和他們使用,似乎是一個更清潔的方式,因爲這樣的:

data.ReturnData += delegate(DataSet returnedDataSet) 
            { 
             dataset = returnedDataSet; 
            }; 

有沒有垮臺這種方式?

謝謝。

+2

還檢查了喬恩斯基特的「委託和事件」的文章http://csharpindepth.com/Articles /Chapter2/Events.aspx – 2011-03-23 12:55:29

回答

2

使用匿名代理(或taster建議的更清晰的Lambda)的一個主要問題是您將無法在事件後退訂它,除非您給它某種類型的名稱。

在大多數情況下,這是「No Big Deal(tm)」,因爲只要事件源消失,代理就會消失,但如果您訂閱了靜態消息,這可能是一個「微妙的錯誤(tm)」事件或事件在長期存在的對象上(例如,WPF Dispatcher對象)。在你的情況下,這看起來不是什麼問題,所以我肯定會推薦使用tter的建議(假設你使用的是最新版本的。網):

data.ReturnData += returnedDataSet => dataset = returnedDataSet; 

(編譯器可以推斷returnedDataSet從事件處理程序類型的ReturnData類型)

1

使用匿名代理的主要問題是它們不可重用。除此之外,在定義委託並在代碼的其他地方使用它與使用匿名委託之間通常沒有區別。

1

下跌的一個原因是它不會出現在您的方法下拉列表中。如果你這樣做,它應該是簡單的,沒有太複雜。

0

唯一的缺點就是如果你有多個事件,它更容易指向一個方法。如果您必須將不同塊中的事件附加到相同的處理程序,則必須將代理存儲在某處,以便兩個塊都能「看到」它。

0

即使清潔:

data.ReturnData += returnedDataSet => dataset = returnedDataSet; 
+0

儘管這樣更清潔,但並沒有解決他的問題。 – CodeNaked 2011-03-23 13:02:16

+0

@CodeNaked,這個問題的其他7個答案中的很多已經回答了這個問題。但是,我的答案是獨一無二的,幾乎肯定會對OP有所幫助。 – tster 2011-03-23 13:08:18

0

都能跟得上它只是匿名方法多數民衆贊成。 你可以閱讀更多關於匿名方法here

+0

+1對於不合理-1。 – 2011-03-23 13:05:58

0

除了可重用/智能感知的其他答案,我相信唯一的缺點是如果您需要稍後刪除處理程序。使用委託/ lamba時,如果不再需要調用處理程序,則無法輕鬆移除它。

1

就像別人說的一樣,最明顯的是不可重複使用的。 其他景點:

  • 可讀性特別是如果你有大量的方法體
  • 因爲.NET生成匿名方法隨機名稱(意義不大或可讀的),如果你使用反射型技術或分析器,它可可追溯性複雜化。