【问题标题】:If / else statements in C#C# 中的 if / else 语句
【发布时间】:2013-04-21 12:51:15
【问题描述】:

为什么会这样?

    private void button1_Click(object sender, EventArgs e)
    {
        if (!checkBox1.Checked)
        {
            MessageBox.Show("The box is not checked!");
        }
        if (checkBox1.Checked == true)
        {
            if (label1.BackColor == Color.Red)
            {
                label1.BackColor = Color.Blue;
            }
            else
            {
                label1.BackColor = Color.Red;
            }
        }
    }

但这不是吗?

   private void button1_Click(object sender, EventArgs e)
    {
        if (!checkBox1.Checked)
        {
            MessageBox.Show("The box is not checked!");
        }
        if (checkBox1.Checked == true)
        {
            if (label1.BackColor == Color.Red)
            {
                label1.BackColor = Color.Blue;
            }
            if (label1.BackColor == Color.Blue)
            {
                label1.BackColor = Color.Red;
            }
        }
    }

我认为编译器会在我每次按下按钮时读取这些行,因此两个 if 语句相继出现应该没有什么不同。

【问题讨论】:

  • 简短回答:在第二种方法中,2 个 if/then 语句不是独立的。第一影响第二。
  • 这实际上并不特定于 C#,这种类型的代码会在每种编程语言中产生相同的问题。
  • 非常感谢大家的帮助!

标签: c# if-statement syntax


【解决方案1】:

如果它是红色,您将变为蓝色然后如果它是蓝色,您将其变为红色。基本上首先,如果第一个 if 将其更改为蓝色,然后第二个 if 将其更改回红色。它是这样工作的,因为指令是按顺序执行的,所以你的第二个if 总是在你的第一个if 之后检查。只需使用else if,如果第一个被触发,第二个if 将不起作用:

// if red then change to blue
if (label1.BackColor == Color.Red)
{
    label1.BackColor = Color.Blue;
}
// otherwise, if blue then change to red
// this condition will be checked if first "if" was false
else if (label1.BackColor == Color.Blue)
{
    label1.BackColor = Color.Red;
}

【讨论】:

  • 是的,只需在此处添加else if
【解决方案2】:

为什么第二个 sn-p 不起作用。

因为在第二个 sn-p 中,两个 if 语句都是独立的。颜色从第一个 if 变为蓝色后,第二个 if 被调用并将其颜色更改回红色。你需要一个else if

        if (label1.BackColor == Color.Red)
        {
            label1.BackColor = Color.Blue;
        }
        else if (label1.BackColor == Color.Blue)
        {
            label1.BackColor = Color.Red;
        }

【讨论】:

    【解决方案3】:
    private void button1_Click(object sender, EventArgs e)
    {
        if (!checkBox1.Checked)
            MessageBox.Show("The box is not checked!");
        else
           label1.BackColor = (label1.BackColor == Color.Red ? Color.Blue : Color.Red);
    }
    

    【讨论】:

    • 虽然显示替代方法可能很有用,但您实际上并没有回答 OP 的问题,即为什么第一种情况有效,而不是第二种情况。如果您要回答这个问题,我会为您的回答 +1。
    【解决方案4】:

    这是一个逻辑问题,下面是一个为什么它不起作用的例子:

    // label is blue at this point
    if (label1.BackColor == Color.Blue)
    {
        // we change the colour to red
    }
    // label is red at this point
    if (label1.BackColor == Color.Red)
    {
        // we change it back to blue
    }
    

    语句之间的区别在于第一次使用else,它改变了逻辑流程,因此您一次只能处理一个场景(它是红色或蓝色)。但是,在第二个中,因为它们是 2 个单独的语句,您正在连续处理这两种情况。对此有几个解决方案,最明显的(可能也是最好的)是像您一样使用else。但是,您也可以使用switch

    switch (label1.BackColor)
    {
        case Color.Blue:
            label1.BackColor = Color.Red;
            break;
        case Color.Red:
            label1.BackColor = Color.Blue;
            break;
    }
    

    您也可以将您的代码保留在第二个 sn-p 中,但只需使用 return 关键字告诉您已完成的功能,例如

    if (label1.BackColor == Color.Blue)
    {
        // change to red
        return;
    }
    

    或者,如果您想要真正花哨,您实际上可以完全重构 if 语句并在一个衬里中完成它 - 虽然看起来很丑......

    label1.BackColor = checkbox1.Checked ? label1.BackColor = Color.Blue ? Color.Red : Color.Blue : label1.BackColor
    

    仅供参考 - if (checkbox1.Checked == true) 是毫无意义的检查,只需使用 if (checkbox1.Checked)

    【讨论】:

    • 取决于未选中该框的消息是否为要求。
    • @JasonDown 如果复选框被选中,颜色应该交替,因此在单行中,如果未选中该框,它只会保持背景颜色相同。显然,如果 OP 需要抛出一个消息框,那么您甚至不需要该部分,因为代码只会在我们处于“已检查”状态时才会执行。
    【解决方案5】:

    如果您要放置 2 个或更多单独的 IF 语句,则所有 IF 语句都会被执行。

    如果您使用 IF ELSE 或 SWITCH,则该序列中的任何一个都将被执行。

    应该使用什么类型的语句,你必须自己决定。

    【讨论】: