当一个方法从if else语句返回一个值时,else语句中应包含哪些值?

时间:2014-03-05 23:50:39

标签: c# if-statement methods

这里只是一个初学者,我有一个控制台应用程序,计算一个工作正常的停车场的应付费用,至少在你输入一个正数值之前。

我们刚刚开始使用多种方法,我的问题是我传递'hours'值的方法使用If else语句来获取费用值,但是当方法传回一个double我是一个对于其他什么是最佳实践,我感到很困惑。

理想情况下,我希望能够为“小时”输入无效值(负整数),程序将返回错误消息并再次退回到程序的开头。

为了获得该效果,我现在设置else的返回值以将值传递回0,然后在main方法中使用if语句来处理'hours'= 0的情况。然后我'我正在使用goto来做到这一点,但我不确定这是最好的做法。如果是,那很好,但是如果有更好的方式,我宁愿不依赖于更糟糕的东西。

为任何和所有帮助干杯。

    class Program
{        

    static void Main(string[] args)
    {
        double charge = 0;
        double hours = 0;
        string reg;

        start:

        while (hours != -999)
        {
            Console.Write("\nEnter hours : ");
            hours = Convert.ToDouble(Console.ReadLine());

            charge = CalcCharge(hours);     

            if (charge == 0)
            {
                Console.Write("Invalid hour value. Please try again.\n");
                goto start;
            }

            Console.Write("\nEnter reg : ");
            reg = Console.ReadLine();

            if (reg == "Sligo")
                charge = charge - ((charge / 100) * 10);

            if (charge > 100)
                charge = 100;

            Console.Write("\nThe charge is ${0:f2}.", charge);

            Console.ReadLine();
        }

    }

    static double CalcCharge(double hours)
    {
        double result;

        if (hours > 0 && hours < 7)
        {
            result = hours * 2;
            return result;
        }

        if (hours >= 7 && hours <= 10)
        {
            result = hours * 3;
            return result;

        }

        if (hours >= 11 && hours <= 15)
        {
            result = hours * 4;
            return result;

        }

        if (hours > 15)
        {
            result = hours * 3;
            return result;

        }

        else
        {
            return 0;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

您可能不应该使用else,而是抛出异常。在这里使用ArgumentException可能是正确的。捕获异常而不是检查返回值:

public static void Main(string[] args)
{
    //your code
    try
    {
        charge = CalcCharge(hours); 
    }
    catch(ArgumentException)
    {
        Console.Write("Invalid hour value. Please try again.\n");
        continue;
    }

...

static double CalcCharge(double hours)
{
    //Your code
    throw new ArgumentException("hours");
}

此外,避免使用goto,因为这是不好的做法,可能会导致非常混乱的意大利面条代码。如果你看一下这个例子,我会使用一个continue,它基本上是说“回到循环的开始”。

答案 1 :(得分:0)

我可能会将你的功能改为:

static double CalcCharge(double hours)
{
    double result = 0;

    if (hours > 0 && hours < 7)
    {
        result = hours * 2;        
    }
    else if ((hours >= 7 && hours <= 10) || hours > 15)
    {
        result = hours * 3;
    }
    else if (hours >= 11 && hours <= 15)
    {
        result = hours * 4;
    }
    else
    {
         throw new ArgumentOutOfRangeException("there was a problem!");
    }
    return result;

}

这有点简洁,如果出现问题,它可以让你在父函数中捕获异常。