我是一名绝对的初学程序员,正在使用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;
}
}
答案 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 = true
将metronome
设置为true
,然后检查整个表达式的值,true
中的if
并执行那说。
C#使得其他C风格的语言变得更难(因为在这些语言中,true
中的许多作业被转换为false
或if
,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
。
顺便说一下,这就是为什么你可以写下面的内容(给a
和b
分配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
}