在倒计时中简单的bool翻转

时间:2014-01-17 22:59:44

标签: c# boolean counter

我是一名绝对的初学程序员,正在使用visual studio 2012学习C#。

我创建了一个涉及计数器的小型表单程序。我想要为每个刻度改变颜色的背景,但我无法理解为什么我的代码不起作用。颜色改变一次然后保持这种状态。我必须犯一个根本性的错误。

任何人都可以看到这个问题是什么吗?

    public Form1()
    {
        InitializeComponent();
        timer1.Start();
    }

    int timeLeft = 60;
    bool metronome = true;

    public void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Interval = 1000;
        if (timeLeft > 0)
        {
            timeLeft = timeLeft - 1;
            timeLabel.Text = Convert.ToString(timeLeft);
            Metronome();
        }
        else
        {
            // Stop the timer
            timer1.Stop();                
        }
    }


    public void Metronome()
    {
        metronome = !metronome;
        if (metronome = true)
                {
                    this.BackColor = System.Drawing.Color.Crimson;
                }
        else
                {
                    this.BackColor = System.Drawing.Color.Black;
                }
    }

4 个答案:

答案 0 :(得分:5)

你在条件上犯了一个错误:

if (metronome = true)

您在这里使用the assignment operator。那你刚才做的是将true设置为metronome,然后metronome的值始终为true。它应该是the equality operator

if (metronome == true)

或者更好:

if (metronome)

答案 1 :(得分:3)

if (metronome = true)

首先metronome = truemetronome设置为true,然后检查整个表达式的值,true中的if并执行那说。

C#使得其他C风格的语言变得更难(因为在这些语言中,true中的许多作业被转换为falseif,C#只是拒绝处理),但它仍然可以发生在bool s。

您可能想要的是if (metronome == true)

如果你的习惯是if (metronome),更加惯用,更难以犯这个错误。

编译时应该有警告,例如:

  

警告CS0665:条件表达式中的赋值始终是常量。你的意思是使用`=='吗?

请务必查看这些警告,如果您感到困惑,请查看这些警告(例如http://msdn.microsoft.com/en-us/library/c1sde1ax%28v=vs.90%29.aspx是关于该错误的。)

警告与错误不同,因为有时候我们真的想要做出警告的事情有一些奇怪的原因,而不是对编译器只是无意义的错误或明显不好的想法,但它们总是值得检查,特别是如果你是初学者。

答案 2 :(得分:1)

肯定if (metronome = true)应为if (metronome == true)? 甚至是if (metronome)。此外,当您的代码无法按预期工作时,有助于将Breakpoints放入代码中,以便您可以对其进行调试。例如,您可以在Metronome方法中放置一个并逐步执行代码,检查值并查看实际正在进行的操作。

答案 3 :(得分:0)

我想有关于你的错字的所有说法。 :)但是,我想补充一点,你甚至可以使用意外分配来切换颜色本身。单行:

public void Metronome()
{
    this.BackColor = (metronome = !metronome) ? Color.Crimson : Color.Black;
}

如果切换变量metronome在开头是false,则第一个调用将分配Color.Crimson,第二个Color.Black,...这是由于事实上,表达"赋值变量"评估指定的值本身。因此,首先metronome会切换到true,因此整个表达式为true,因此会分配Color.Crimson

顺便说一下,这就是为什么你可以写下面的内容(给ab分配5):

int a, b;
a = b = 5;

我使用了这种变体(也是切换和检查的组合),例如在setter或short方法中设置变量以执行函数或在值更改时引发事件。 (这是有效的,因为表达式是从左到右计算的。)

private bool aValue;
public void SetIt() 
{ 
    if (aValue != (aValue = true)) 
      onSet(); // do something on change to true
}
public void UnsetIt() 
{ 
    if (aValue != (aValue = false))
      onUnset();  // do something on change to false
}