3

ここに画像の説明を入力

なぜこれが機能するのですか?

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

ボタンを押すたびにコンパイラが行を読み取ると思うので、2 つの if ステートメントが連続していても違いはありません。

4

5 に答える 5

6

赤の場合は青に変更し、青の場合は赤変更しています。基本的に、最初に最初ifに青に変更し、次に2番目ifに赤に変更します。命令は順番に実行されるため、このように機能します。そのため、2 番目ifは常に最初の の後にチェックされますif。最初のものが発火した場合else if、2番目は機能しないので、使用してください: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;
}
于 2013-04-27T11:57:27.217 に答える
3

2 番目のスニペットが機能しない理由。

2 番目のスニペットでは、両方のifステートメントが独立しているためです。最初の から色が青に変わった後if、2 番目ifが呼び出され、その色が赤に戻ります。が必要ですelse if

        if (label1.BackColor == Color.Red)
        {
            label1.BackColor = Color.Blue;
        }
        else if (label1.BackColor == Color.Blue)
        {
            label1.BackColor = Color.Red;
        }
于 2013-04-27T12:01:12.643 に答える
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 つのシナリオ (赤または青) のみを処理します。ただし、2 番目のステートメントは 2 つの別個のステートメントであるため、両方のシナリオを連続して扱っています。これにはいくつかの解決策があります。最も明白な (そしておそらく最良の) 方法は、else既に使用しているのと同じように使用することです。ただし、次を使用することもできますswitch

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

return2番目のスニペットにあるコードを保持することもできますが、キーワードを使用して完了した機能を伝えるだけです.

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

または、本当に派手になりたい場合は、実際にifステートメントを完全にリファクタリングして、1 つのライナーで実行することもできますが、かなり醜いように見えます...

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

参考までに-if (checkbox1.Checked == true)無意味なチェックです。使用してくださいif (checkbox1.Checked)

于 2013-04-27T12:08:48.140 に答える
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);
}
于 2013-04-27T12:04:18.900 に答える
0

2 つ以上の別々の IF ステートメントを配置している場合、すべての IF ステートメントが実行されます。

IF ELSE または SWITCHを使用すると、そのシーケンスのいずれかが実行されます。

どのタイプのステートメントを使用する必要があるかを決定する必要があります。

于 2013-04-27T12:43:09.163 に答える