使用+ =运算符将方法绑定到C#中的事件

Pet*_*son 1 c# events

我正在制作一个Windows窗体,我试图手动将一个方法绑定到myButton的click事件,如下所示:

    public Form1()
    {
        InitializeComponent();
        myButton.Click = new EventHandler(ShowMessage("You clicked my button!"));
    }

    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
Run Code Online (Sandbox Code Playgroud)

正如你们有些人猜测的那样,编译器并不喜欢这样.我不知道为什么,因为我习惯于能够在Javascript中做这样的事情:

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

我混淆了它并最终做了一件非常丑陋的事情涉及这样的全局变量:

    string message = "";
    public Form1()
    {
        InitializeComponent();
        message = "You clicked my button!";
        myButton.Click += ShowMessage; 
    }

    private void ShowMessage(object sender, EventArgs e)
    {
        MessageBox.Show(message);
    }
Run Code Online (Sandbox Code Playgroud)

这是我的两个问题:首先,有更清洁的方法吗?其次,为什么事件方法必须分配一个+=而不仅仅是一个=

Ken*_*kot 6

事件处理程序必须添加到事件中,+=因为事件可能有多个其他委托对您的特定代码未知.纯粹的赋值意味着能够删除其他相关代表,这是您不应该作为事件的客户端做的事情.

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

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


Adr*_*BEN 6

你也可以使用lambda.

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