当我尝试使用Switch case功能时,除了案例5之外,它始终是默认消息:
private void btnCandlesLight_Click(object sender, EventArgs e)
{
int result;
result = Convert.ToInt32(textBox1.Text);
switch(result)
{
case 1:
day1.Start();
candlesOne();
break;
case 2:
day2.Start();
candlesTwo();
break;
case 3:
day3.Start();
candlesThree();
break;
case 4:
day4.Start();
candlesFour();
break;
case 5:
day5.Start();
candlesFive();
break;
case 6:
day6.Start();
candlesSix();
break;
case 7:
day7.Start();
candlesSeven();
break;
case 8:
day8.Start();
candlesEight();
break;
default:
MessageBox.Show("Enter new day");
break;
}
}
当我在文本框中输入值1时,默认情况有效,但只有当我输入值5时才能正常工作。 如果你想看到函数“candlesOne”和“candlesFive”之间的区别:
“c”变量是秒的变量。我试图用一个计时器,每隔2-3秒点亮一次蜡烛。
public void candlesOne()
{
firedmatch.Left = firedmatch.Left + 100;
if (c == 1)
{
candle1.Visible = true;
}
if (c == 3)
{
candle2.Visible = true;
}
}
和
public void candlesFive()
{
firedmatch.Left = firedmatch.Left + 100;
if(c == 1)
{
candle1.Visible = true;
}
if(c == 3)
{
candle2.Visible = true;
}
if(c == 5)
{
candle3.Visible = true;
}
if(c == 7)
{
candle4.Visible = true;
}
if(c == 11)
{
candle5.Visible = true;
}
}
我没有发现错误, 你们能帮助我吗? 感谢
答案 0 :(得分:2)
您是否因为转化中的“1”输入而检查了您是否真的得到(int)1
?
在更广泛的范围内,代码中有很多重复,你应该考虑重构一下。
在您的CandlesOne和CandlesFive方法中,您使用c
变量,不知道它是什么或来自何处。这两种方法(可能还有其他CandlesXXX()
做同样的事情。你不能通过推广逻辑来消除复杂性吗?你的switch案例中使用的result
可以作为参数传递吗?用于触发c == X
方法中CandleXXX()
次调用的数量?
这样你可以移除开关并失去很多复杂性!
修改强>
如果您还有其他问题,请考虑创建.NET Fiddle,我会错过您代码中的大量背景信息,因此我无法在此有效地为您提供帮助。
为您提供一些重构想法:
// Somewhere else in your code, create a dictionary with your day1-day8 objects
var days = new Dictionary<int, Day>()
days[1] = day1;
...
days[8] = day8;
//Simplfiy your method
private void btnCandlesLight_Click(object sender, EventArgs e)
{
try
{
var dayIndex = Convert.ToInt32(textBox1.Text);
if(dayIndex > 0 && dayIndex <= 8)
{
days[dayIndex].Start(); //Get the corresponding day via its Key
LightUpCandles(dayIndex); //pass the key as a parameter
}
else
{
MessageBox.Show("Enter new day");
}
}
catch(InvalidCastException exception)
{
//Whatever you do when the textbox cannot be parsed
}
}
我仍然没有得到你的蜡烛五种方法真正做的事情或为什么方法“candleOne”点亮了两支蜡烛(注意变量命名)。我也不知道这是如何构成某种计时器的...但是这里仍然是第一次潜在的重构:
public void LightUpCandles(int dayIndex)
{
firedmatch.Left = firedmatch.Left + 100;
if(c == 1)
{
candle1.Visible = true;
}
if(c == 3 && dayIndex > 1)
{
candle2.Visible = true;
}
if(c == 5 && dayIndex > 2)
{
candle3.Visible = true;
}
if(c == 7 && dayIndex > 3)
{
candle4.Visible = true;
}
if(c == 11 && dayIndex > 4)
{
candle5.Visible = true;
}
}
答案 1 :(得分:1)
您的开关逻辑是正确的,我使用以下测试;
int result;
result = Convert.ToInt32(textBox1.Text);
switch (result)
{
case 1:
MessageBox.Show("1");
break;
case 2:
MessageBox.Show("2");
break;
case 3:
MessageBox.Show("3");
break;
case 4:
MessageBox.Show("4");
break;
case 5:
MessageBox.Show("5");
break;
case 6:
MessageBox.Show("6");
break;
case 7:
MessageBox.Show("7");
break;
case 8:
MessageBox.Show("8");
break;
default:
MessageBox.Show("Enter new day");
break;
}
如果您没有得到相同的结果,我可能会考虑让上面的消息框显示变量的数据类型。
MessageBox.Show(result.GetType().ToString());