2011-03-14 298 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); 
    } 
}