除一例外,开关盒变为默认值

时间:2015-12-14 12:20:09

标签: c# winforms

当我尝试使用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;
        }
    }

我没有发现错误, 你们能帮助我吗? 感谢

2 个答案:

答案 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());