C# 单击事件和C中的用户定义事件之间有什么区别

C# 单击事件和C中的用户定义事件之间有什么区别,c#,events,C#,Events,我试图更好地理解事件,我看到了一些让我感到困惑的代码。。 我知道,例如,当我想要声明一个事件并稍后订阅它时,我会这样做: public event EventHandler MyEvent; ... MyEvent += MyFunction; MyEvent += new SomeClass().SomeFunction; btn.Click += this.BtnFunction; 所以在这里,我声明了事件,并为它添加了一些函数。这很容易 后来我发现了这段代码: protected vo

我试图更好地理解事件,我看到了一些让我感到困惑的代码。。 我知道,例如,当我想要声明一个事件并稍后订阅它时,我会这样做:

public event EventHandler MyEvent;
...
MyEvent += MyFunction;
MyEvent += new SomeClass().SomeFunction;
btn.Click += this.BtnFunction;
所以在这里,我声明了事件,并为它添加了一些函数。这很容易

后来我发现了这段代码:

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+=neweventhandlerThis.btn函数; 问题是:

为什么要使用新的EventHandlerthis.BtnFuncion?Click事件不是EventHandler类型的吗

EventHandler是否有构造函数?为什么它现在接受应该订阅此事件的函数


这是分配事件处理程序的简短符号:

MyEvent += MyFunction;
这是长符号:

btn.Click += new EventHandler(this.BtnFunction);
这一行可以这样写:

public event EventHandler MyEvent;
...
MyEvent += MyFunction;
MyEvent += new SomeClass().SomeFunction;
btn.Click += this.BtnFunction;

这是分配事件处理程序的简短符号:

MyEvent += MyFunction;
这是长符号:

btn.Click += new EventHandler(this.BtnFunction);
这一行可以这样写:

public event EventHandler MyEvent;
...
MyEvent += MyFunction;
MyEvent += new SomeClass().SomeFunction;
btn.Click += this.BtnFunction;

.Net BCL的事件和用户定义的事件没有区别。单击事件如下所示:

public event EventHandler Click;
是委托类型,用于.Net BCL的事件。我想您已经看到了一些事件处理程序,比如void functionobject sender、EventArgs e。EventHandler如下所示:

public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
第二个委托EventHandler在事件需要发送某些信息时使用。例如:

public event EventHandler<SomeClass> MyEvent;

编辑:注意,建议SomeClass为协方差继承EventArgs。Net BCL的事件和用户定义的事件没有区别。单击事件如下所示:

public event EventHandler Click;
是委托类型,用于.Net BCL的事件。我想您已经看到了一些事件处理程序,比如void functionobject sender、EventArgs e。EventHandler如下所示:

public delegate void EventHandler(object sender, EventArgs e);
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
第二个委托EventHandler在事件需要发送某些信息时使用。例如:

public event EventHandler<SomeClass> MyEvent;

编辑:请注意,建议SomeClass为协方差继承EventArgs

没有区别。这就是所谓的。您不必提供帮助,因为编译器可以确定您打算使用委托。这种糖很重要,因为如果没有它,您必须写下以下内容才能取消订阅活动:

    btn.Click -= new EventHandler(this.BtnFunction);
这给正在学习该语言的毫无戒心的新C程序员敲响了警钟:创建一个新的委托来删除事件处理程序??对真正地没有人会把保险丝烧断:

    btn.Click -= this.BtnFunction;

即使委托构造函数调用是语法糖,它实际上也需要两个参数。一个用于设置目标属性,另一个用于设置方法。目标由编译器推断,它是这样的。双参数构造函数语法在C中是不合法的,像C++/CLI这样的语言就有这种语法。

没有区别。这就是所谓的。您不必提供帮助,因为编译器可以确定您打算使用委托。这种糖很重要,因为如果没有它,您必须写下以下内容才能取消订阅活动:

    btn.Click -= new EventHandler(this.BtnFunction);
这给正在学习该语言的毫无戒心的新C程序员敲响了警钟:创建一个新的委托来删除事件处理程序??对真正地没有人会把保险丝烧断:

    btn.Click -= this.BtnFunction;

即使委托构造函数调用是语法糖,它实际上也需要两个参数。一个用于设置目标属性,另一个用于设置方法。目标由编译器推断,它是这样的。双参数构造函数语法在C语言中是不合法的,像C++/CLI这样的语言有它。

哦,现在我明白了:谢谢!哦,现在我明白了:谢谢!编辑:我忘了写关于协方差的东西编辑:我忘了写关于协方差的东西现在它有了完美的意义!因为EventHandler是一个委托,它使我们使用对象发送者EventArgs e。这让我想起了这件事!非常感谢。现在它有了完美的意义!因为EventHandler是一个委托,它使我们使用对象发送者EventArgs e。这让我想起了这件事!非常感谢。谢谢你的回答,汉斯。这澄清了我对事件的疑问。谢谢你的回答。这澄清了我对事件的疑问。