當.NET訂閱事件做我需要創建委託的新實例,如訂閱事件
toolbarControl1.OnUploadEventHandler +=
new ToolbarControl.UploadEventHandler(toolbarControl1_OnUpload);
還是更做到以下幾點?
toolbarControl1.OnUploadEventHandler += toolbarControl1_OnUpload;
在此先感謝。
當.NET訂閱事件做我需要創建委託的新實例,如訂閱事件
toolbarControl1.OnUploadEventHandler +=
new ToolbarControl.UploadEventHandler(toolbarControl1_OnUpload);
還是更做到以下幾點?
toolbarControl1.OnUploadEventHandler += toolbarControl1_OnUpload;
在此先感謝。
第二個花費較少的代碼,兩者意味着相同。
您可能要考慮使用EventHandler的通用版本 - EventHandler<TEventArgs>
。您將節省宣佈所有這些代表。
你也可以使用lambda表達式,即。
toolbarControl1.OnUploadEventHandler +=
(sender, args) => { /* Your code goes here */ };
它們是等效的。第二個只提供更好的可讀性。
它們是等效的,除非您需要保留對委託的引用以取消訂閱。
不,即使您取消訂閱,您也可以使用相同的語法 - 您最終會創建兩個平等的代理人,因爲他們都會有相同的目標和相同的方法。 – 2011-03-14 13:07:25
@Maslow:我在說,如果你退訂一個新的,但*平等*委託的參考,它將工作得很好。所以你可以使用'toolbarControl1.OnUploadEventHandler - = toolbarControl1_OnUpload;'取消訂閱,沒有問題。 – 2011-03-14 13:16:43
我似乎記得這不起作用,但我不記得確切的情況。它可能不是我指出的一種命名方法。 – 2011-03-14 13:45:57
你可以做到這一點,所以你的偏好。
你也可以做這樣的事情非常簡單的處理程序,以節省編寫一個委託函數:
toolbarControl1.OnUploadEventHandler += (s, e) => uploadCount +=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);
}
}
我相信這個鏈接可以幫助回答你的問題。目前我無法查看該頁面,但Google的結果看起來很有希望。 :) * http://www.csharp-station.com/Tutorials/lesson14.aspx* – 2011-03-14 13:06:02