2011-03-14 190 views
3

當.NET訂閱事件做我需要創建委託的新實例,如訂閱事件

toolbarControl1.OnUploadEventHandler += 
    new ToolbarControl.UploadEventHandler(toolbarControl1_OnUpload); 

還是更做到以下幾點?

toolbarControl1.OnUploadEventHandler += toolbarControl1_OnUpload; 

在此先感謝。

+0

我相信這個鏈接可以幫助回答你的問題。目前我無法查看該頁面,但Google的結果看起來很有希望。 :) * http://www.csharp-station.com/Tutorials/lesson14.aspx* – 2011-03-14 13:06:02

回答

9

第二個花費較少的代碼,兩者意味着相同。

您可能要考慮使用EventHandler的通用版本 - EventHandler<TEventArgs>。您將節省宣佈所有這些代表。

你也可以使用lambda表達式,即。

toolbarControl1.OnUploadEventHandler += 
    (sender, args) => { /* Your code goes here */ }; 
0

它們是等效的。第二個只提供更好的可讀性。

0

它們是等效的,除非您需要保留對委託的引用以取消訂閱。

+2

不,即使您取消訂閱,您也可以使用相同的語法 - 您最終會創建兩個平等的代理人,因爲他們都會有相同的目標和相同的方法。 – 2011-03-14 13:07:25

+0

@Maslow:我在說,如果你退訂一個新的,但*平等*委託的參考,它將工作得很好。所以你可以使用'toolbarControl1.OnUploadEventHandler - = toolbarControl1_OnUpload;'取消訂閱,沒有問題。 – 2011-03-14 13:16:43

+0

我似乎記得這不起作用,但我不記得確切的情況。它可能不是我指出的一種命名方法。 – 2011-03-14 13:45:57

2

你可以做到這一點,所以你的偏好。

你也可以做這樣的事情非常簡單的處理程序,以節省編寫一個委託函數:

toolbarControl1.OnUploadEventHandler += (s, e) => uploadCount +=1; 
1

的代碼不言自明:

using System; 
class Program 
{ 
    void SomeMethod(object sender, EventArgs e) { } 
    event EventHandler SomeEvent; 
    static void Main(string[] args) 
    { 
     var prog = new Program(); 

     // Demonstrate that they are equivalent 
     prog.SomeEvent += new EventHandler(prog.SomeMethod); 
     prog.SomeEvent -= prog.SomeMethod; // Sugar for new EventHandler(prog.SomeMethod) 
     Console.WriteLine("Number of SomeEvent subscribers is {0}", (prog.SomeEvent != null ? prog.SomeEvent.GetInvocationList() : new Delegate[0]).Length); 

     // Why are they equivalent? 
     var d1 = new EventHandler(prog.SomeMethod); 
     var d2 = new EventHandler(prog.SomeMethod); 
     Console.WriteLine("Delegates are reference equal {0}", Object.ReferenceEquals(d1, d2)); 
     Console.WriteLine("Delegates are equivalent {0}", d1 == d2); 
    } 
}