Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用+;将方法绑定到C中的事件操作人员_C#_Events - Fatal编程技术网

C# 使用+;将方法绑定到C中的事件操作人员

C# 使用+;将方法绑定到C中的事件操作人员,c#,events,C#,Events,我正在制作一个windows窗体,并试图手动将一个方法绑定到myButton的click事件,如下所示: public Form1() { InitializeComponent(); myButton.Click = new EventHandler(ShowMessage("You clicked my button!")); } private void ShowMessage(string message) {

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

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

    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
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);
    }
正如你们中的一些人可能猜到的,编译器不喜欢这样。我不知道为什么,因为我习惯用Javascript做这样的事情:

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

    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
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);
    }
我糊涂地度过了难关,最终做了一件非常丑陋的事情,涉及到一个全局变量,比如:

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

    private void ShowMessage(string message)
    {
        MessageBox.Show(message);
    }
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);
    }

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

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

例如:

myButton.Click += ShowMessage;
myButton.Click += LogToFile;
当按钮点击时,ShowMessage和LogToFile两个函数都会被调用。这就是“+=”中的“+”试图表示的内容。您正在添加到处理程序,而不是替换它

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

这里是我的两个问题:第一,是什么 有没有更干净的方法

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

为什么必须使用事件方法 分配了+=而不仅仅是=


否则,同一事件只能有一个eventhandler,而不能有多个eventhandler在编程语言中经常用于添加内容用于将变量设置为值。

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

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

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

您可以键入
myButton.Click+=delegate{showmessage(“您单击了我的按钮!”);}

尝试此解决方案,以避开全局变量的需要,并为事件处理程序提供一个命名的、可重用的方法:

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!");
    };  
}

您也可以使用lambda

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

尝试使用匿名代理时的一个警告;除非将该委托指定给长期变量,否则将无法将该委托与事件分离。这是因为没有对委托进行语义检查;它们仅通过引用等同,因此没有其他匿名委托,即使代码完全相同,也不会与附加的委托具有相同的引用。