我正在努力更好地理解事件,并且我看到一些令我困惑的代码行。 我知道,例如,当我想宣布一个事件并稍后订阅它时,我会这样做:
public event EventHandler MyEvent;
...
MyEvent += MyFunction;
MyEvent += new SomeClass().SomeFunction;
所以在这里我宣布了事件,并为它添加了一些函数。这很容易。
后来我找到了这段代码:
protected void Page_Load(object sender, EventArgs e)
{
for(int i =0; i<5; i++)
{
Button btn = new Button();
btn.Text = "Button " + i.ToString();
Panel1.Controls.Add(btn);
btn.Click += new EventHandler(this.BtnFunction);
}
}
void BtnFunction(object sender, EventArgs e)
{
Button btn = (Button)sender;
Label1.Text = btn.Text;
}
现在我无法理解的是这一行:btn.Click += new EventHandler(this.BtnFunction);
问题是:
为什么我要使用new EventHandler(this.BtnFuncion)
?不是Click
类型的EventHandler
事件吗?
EventHandler
是否有构造函数,为什么现在需要订阅此事件的函数?
答案 0 :(得分:4)
.Net BCL的事件和用户定义的事件没有什么不同。 Click
事件如下:
public event EventHandler Click;
EventHandler是委托类型,用于.Net BCL的事件。我想你已经看过一些事件处理程序,比如void function(object sender, EventArgs e)
。 EventHandler
就像下面这样:
public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
第二个代理EventHandler<TEventArgs>
用于发送某些信息所需的事件。例如:
public event EventHandler<SomeClass> MyEvent;
编辑:请注意,SomeClass
建议继承EventArgs
协方差
答案 1 :(得分:3)
这是分配事件处理程序的简短表示法:
MyEvent += MyFunction;
这是长记:
btn.Click += new EventHandler(this.BtnFunction);
这一行可以这样写:
btn.Click += this.BtnFunction;
答案 2 :(得分:3)
没有区别。这称为syntax sugar。您没有拥有来提供帮助,因为编译器可能会发现您打算使用委托。这个糖很重要,因为如果没有它,你必须写这个以取消订阅事件:
btn.Click -= new EventHandler(this.BtnFunction);
这给那些正在学习该语言的毫无疑问的新C#程序员带来了重大警钟:“创建一个新的委托给删除一个事件处理程序??”是。真。没人吹过熔丝:
btn.Click -= this.BtnFunction;
即使是委托构造函数调用也是语法糖,它实际上需要两个参数。一个设置Target属性,另一个设置Method。目标是由编译器推断的,它是 this 。两个参数构造函数语法在C#中是不合法的,像C ++ / CLI这样的语言有它。