订阅活动

时间:2011-03-14 13:02:43

标签: c# .net events delegates

在.NET中订阅事件时,我需要创建一个新的委托实例,例如

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

或者做以下事情会更好吗?

toolbarControl1.OnUploadEventHandler += toolbarControl1_OnUpload;

提前致谢。

5 个答案:

答案 0 :(得分:9)

第二个采用较少的编码,两者的意思相同。

您可能需要考虑使用EventHandler的通用版本 - EventHandler<TEventArgs>。您将保存声明所有这些代表。

您也可以使用lambda表达式,即

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

答案 1 :(得分:2)

你可以做到这两点,所以你的偏好。

对于非常简单的处理程序,您也可以执行此类操作来保存编写委托函数:

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

答案 2 :(得分: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);
    }
}

答案 3 :(得分:0)

它们是等价的。第二个只提供更好的可读性。

答案 4 :(得分:0)

除非您需要保留对代理人的引用以取消订阅,否则它们是等效的。