2013-04-27 176 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那麼將執行該序列中的任何一個。

應該使用哪種類型的語句來決定它。