在c#中使用+=操作符将方法绑定到事件

本文关键字:方法 绑定 事件 操作符 | 更新日期: 2023-09-27 17:53:13

我正在制作一个windows窗体,我试图手动绑定一个方法到myButton的点击事件,像这样:

    public Form1()
    {
        InitializeComponent();
        myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
    }
    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }

你可能猜到了,编译器不喜欢这样。我不知道为什么,因为我已经习惯了在Javascript中做这样的事情:

document.getElementById("myButton").onclick = function(){showMessage("You clicked my button")};
function showMessage(message) {
  alert(message);
}

我糊弄了一下,最终做了一些非常难看的事情,涉及到一个全局变量,像这样:

    string message = "";
    public Form1()
    {
        InitializeComponent();
        message = "You clicked my button!";
        myButton.Click += ShowMessage; 
    }
    private void ShowMessage(object sender, EventArgs e)
    {
        MessageBox.Show(message);
    }

我有两个问题:第一,有没有更干净的方法来做这件事?其次,为什么事件方法必须分配一个+=,而不仅仅是一个= ?

在c#中使用+=操作符将方法绑定到事件

必须使用+=将事件处理程序添加到事件中,因为该事件可能具有您的特定代码段未知的多个其他委托。纯赋值意味着删除其他相关委托的能力,作为事件的客户端,您不应该有权限这样做。

此外,您可能希望利用匿名委托来完成任何形式的参数绑定。例如:

myButton.Click += delegate(object sender, EventArgs e) {
    MessageBox.Show("You clicked my button!");
};

也可以使用lambda

myButton.Click += (sender, e) => {
    MessageBox.Show("You clicked my button!");
};

我有两个问题:第一,是有更干净的方法吗?

是匿名函数,就像JavaScript(其他语法)

myButton.Click += delegate(object sender, EventArgs e)   
{ 
  MessageBox.Show(message);
};  

为什么事件方法必须是赋值与+=,而不仅仅是一个=?

否则,同一个事件只能有一个eventandler,而不是多个。在编程语言中,+=经常被用来表示加法。

可以输入myButton.Click += delegate { showmessage("You clicked my button!"); };

因为可以添加多个处理程序,就像在javascript代码中一样,在onclick中只会调用一个函数。

的例子:

myButton.Click += ShowMessage;
myButton.Click += LogToFile;

函数ShowMessage和LogToFile将被调用时,按钮点击发生。这就是"+="中的"+"想要表达的意思。您是在添加处理程序,而不是替换它。

为了使它更容易,您可以使用匿名lambda来帮助,但请注意,它使以后分离/删除处理程序变得更加困难(如果这很重要)。

myButton.Click += new EventHandler( (sender,e) => ShowMessage("You clicked my button!") );

尝试以下解决方案,以绕过对全局变量的需求,并可能为事件处理程序提供命名的可重用方法:

private void ShowMessage(object sender, EventArgs e, string message)
{
    MessageBox.Show(message);
}

public Form1()
{
    InitializeComponent();
    myButton.Click += delegate(object sender, EventArgs e)   
    { 
        ShowMessage(sender,e,"You clicked my button!");
    };  
}