Click事件与C#中的用户定义事件有什么区别?

时间:2014-01-02 01:15:03

标签: c# events

我正在努力更好地理解事件,并且我看到一些令我困惑的代码行。 我知道,例如,当我想宣布一个事件并稍后订阅它时,我会这样做:

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是否有构造函数,为什么现在需要订阅此事件的函数?

3 个答案:

答案 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这样的语言有它。