2013-04-27 158 views
3

enter image description hereC#中的if/else语句

这是为啥工作?

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; 
      } 
     } 
    } 

我倒觉得compliler会读取行,每行我按下按钮时,所以它不应该有任何的不同有两个后,如果对方的语句。

+2

简答题:在第二种方法中,2 if/then语句不是独立的。第一名影响第二名。 – 2013-04-27 12:01:57

+0

这实际上并不是特定于C#,这种类型的代码会在每种编程语言中产生相同的问题。 – James 2013-04-27 12:37:09

+0

非常感谢帮助! – somethingSomething 2013-04-27 18:34:55

回答

6

如果是红色,您将更改为蓝色,如果蓝色则更改为红色,然后。基本上首先,如果第一个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; 
} 
+1

是的,只需在其中添加一个'else if' – Catalin 2013-04-27 11:59:11

+0

感谢您的评论,我已经更新了我的答案以包含它 – Zbigniew 2013-04-27 12:01:26

3

为什么第二个片段不起作用。

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

 if (label1.BackColor == Color.Red) 
     { 
      label1.BackColor = Color.Blue; 
     } 
     else if (label1.BackColor == Color.Blue) 
     { 
      label1.BackColor = Color.Red; 
     } 
0
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); 
} 
+3

尽管显示一种替代方法可能有用,但您实际上并未回答OP的第一个案例为什么会起作用的问题,但不是第二个。如果你要回答这个问题,除了选择你的答案之外的其他方式。 – 2013-04-27 12:08:09

2

这是一个逻辑问题,这里就是为什么它不工作的例子:

// 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这改变逻辑流程,所以你一次只能处理1个场景(红色或蓝色)。然而,第二,因为它们是两个单独的陈述,所以你正在连续地处理两种情况。有几个解决方案,最明显的(也许是最好的)就是像你已经使用else。但是,你也可以使用一个switch

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

你也可以保持你的代码在第二个片段,但只是告诉你正在使用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)

+0

取决于是否需要未检查框的消息。 – 2013-04-27 12:14:59

+0

+1与编辑 – 2013-04-27 12:21:28

+0

@JasonDown如果复选框被选中,颜色应该交替出现,所以如果没有选中该复选框,它只是保持颜色相同。显然,如果OP需要抛出一个消息框,那么你甚至不需要这个部分,因为只有当我们处于“检查”状态时才会执行代码。 – James 2013-04-27 12:26:25

0

如果你把两个或多个单独的IF语句然后所有的IF语句都会被执行。

如果您使用IF ELSE或SWITCH那么将执行该序列中的任何一个。

应该使用哪种类型的语句来决定它。