当.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