C# 向按钮单击功能添加可选参数

C# 向按钮单击功能添加可选参数,c#,C#,我想为我的按钮单击函数添加一个可选参数,这样我可以通过从另一个函数调用它来插入其他信息 代码如下: private void button1_Click(object sender, EventArgs e, string bla = "") { if (bla.Length > 0) { MessageBox.Show(bla); } else {

我想为我的按钮单击函数添加一个可选参数,这样我可以通过从另一个函数调用它来插入其他信息

代码如下:

    private void button1_Click(object sender, EventArgs e, string bla = "")
    {
        if (bla.Length > 0)
        {
            MessageBox.Show(bla);
        }
        else
        {
            MessageBox.Show("Hi!");
        }
    }
    private void button1_trigger()
    {
        button1_Click(null, null, "hi");
    }
我从visual studio 2012收到的错误

虽然看起来您的代码应该可以工作(最后一个参数是可选的,因此“button1\u Click”应该仍然与委托匹配),但这并不是由于C编译器中的限制。也就是说,编译器无法将方法与委托相匹配,因为该方法具有重载或可选参数。(这是有充分理由的——你可能认为优雅地处理这些案件会更加复杂。埃里克·利珀特(Eric Lippert)在他的博客上写过这个话题。)

我只想添加另一个可以处理这两种情况的函数,并从处理程序中调用该函数:

private void trigger(object sender, EventArgs e, string bla = "")
{
    if (bla.Length > 0)
    {
        MessageBox.Show(bla);
    }
    else
    {
        MessageBox.Show("Hi!");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    trigger(sender, e);
}

private void button1_trigger()
{
    trigger(null, null, "hi");
}
this.button1.Click += (sender, args) => this.button1_Click(sender, args);
编辑

因此,如果出于任何原因不想添加额外函数,则可以使用lambda添加处理程序:

private void trigger(object sender, EventArgs e, string bla = "")
{
    if (bla.Length > 0)
    {
        MessageBox.Show(bla);
    }
    else
    {
        MessageBox.Show("Hi!");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    trigger(sender, e);
}

private void button1_trigger()
{
    trigger(null, null, "hi");
}
this.button1.Click += (sender, args) => this.button1_Click(sender, args);

生成的编译代码实际上非常相似(我相信C#编译器会为匿名委托添加另一个成员函数),但这种语法确实更紧凑。

虽然看起来代码应该可以工作(最后一个参数是可选的,所以“button1\u Click”应该仍然与委托匹配),这不是由于C#编译器中的限制。也就是说,编译器无法将方法与委托相匹配,因为该方法具有重载或可选参数。(这是有充分理由的——你可能认为优雅地处理这些案件会更加复杂。埃里克·利珀特(Eric Lippert)在他的博客上写过这个话题。)

我只想添加另一个可以处理这两种情况的函数,并从处理程序中调用该函数:

private void trigger(object sender, EventArgs e, string bla = "")
{
    if (bla.Length > 0)
    {
        MessageBox.Show(bla);
    }
    else
    {
        MessageBox.Show("Hi!");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    trigger(sender, e);
}

private void button1_trigger()
{
    trigger(null, null, "hi");
}
this.button1.Click += (sender, args) => this.button1_Click(sender, args);
编辑

因此,如果出于任何原因不想添加额外函数,则可以使用lambda添加处理程序:

private void trigger(object sender, EventArgs e, string bla = "")
{
    if (bla.Length > 0)
    {
        MessageBox.Show(bla);
    }
    else
    {
        MessageBox.Show("Hi!");
    }
}

private void button1_Click(object sender, EventArgs e)
{
    trigger(sender, e);
}

private void button1_trigger()
{
    trigger(null, null, "hi");
}
this.button1.Click += (sender, args) => this.button1_Click(sender, args);

生成的编译代码实际上非常相似(我相信C#编译器会为匿名委托添加另一个成员函数),但这种语法肯定更紧凑。

我已经编辑了您的标题。请看“”,其中的共识是“不,他们不应该”。我已经编辑了你的标题。请参阅“”,其中共识是“不,他们不应该”。单击按钮时,它将抛出
NullReferenceException
。不?这是一个“肮脏”的解决办法,我不想做一个额外的功能只是为了触发按钮功能。感谢您的回答,我希望有其他(不太脏的)解决方案。@Ismail我用一个不需要额外功能的替代方案编辑。@Ismail这不是真正的“脏”。控制事件应该只处理获取启动流程所需的信息。该示例显示如何传递发送方和参数,但您始终可以忽略它们。对不起,如果我踩到了你的脚,麦加纳格。伊斯梅尔恰恰相反;试图将事件处理程序硬塞进事件处理程序不是为其设计的角色是非常肮脏的。在需要在多个上下文中重用同一代码位的任何情况下,都可以这样做:将其分离成一个具有合理名称的干净函数。喜欢表达性代码而不是简洁的代码。单击按钮时,它将抛出
NullReferenceException
。不?这是一个“肮脏”的解决办法,我不想做一个额外的功能只是为了触发按钮功能。感谢您的回答,我希望有其他(不太脏的)解决方案。@Ismail我用一个不需要额外功能的替代方案编辑。@Ismail这不是真正的“脏”。控制事件应该只处理获取启动流程所需的信息。该示例显示如何传递发送方和参数,但您始终可以忽略它们。对不起,如果我踩到了你的脚,麦加纳格。伊斯梅尔恰恰相反;试图将事件处理程序硬塞进事件处理程序不是为其设计的角色是非常肮脏的。在需要在多个上下文中重用同一代码位的任何情况下,都可以这样做:将其分离成一个具有合理名称的干净函数。与简洁的代码相比,更喜欢表达性代码。