C#变量范围和"switch"语句?

Sco*_*ott 2 c# scope

这种代码通常可以在PHP中运行,但由于C#中的范围要严格得多,所以并非如此.我不知道如何编写这段代码而不重复自己.

    static double Cube()
    {
        Console.Write("Enter the side length of the cube: ");
        try
        {
            double x = Convert.ToDouble(Console.Read());
            return Math.Pow(x, 3);
        }
        catch (FormatException)
        {
            Console.WriteLine("Invalid input, please enter a number.");
            Cube();
        }
        return 1;
    }
Run Code Online (Sandbox Code Playgroud)

..后来在Main():

            switch (choice)
            {
                case 0:
                    return;
                case 1:
                    double final = Cube();
                    break;
                default:
                    Console.WriteLine("Please enter 0 or 1.");
                    Main();
                    break;
            }
            Console.WriteLine("The volume is: {0}", Convert.ToString(final));
Run Code Online (Sandbox Code Playgroud)

Cube()方法工作正常,但在我看来它很混乱(return 1最后让编译器开心).但是出现了一个错误,称当前上下文中不存在名称"final".它无法找到最终结果.因此,我所看到的唯一方法是将这个Console.WriteLine语句放在double final = Cube()之后.

我也尝试double final;在开关外面声明,然后只final在每个案例中设置,但这也没有用.

谢谢!

Eri*_*ert 19

你是对的:这是一团糟.重来.

你的根本问题是你没有分开你的担忧.您有一个方法可以同时执行用户输入,输入验证,重试逻辑和数学运算.你应该为每个人制定方法.

此外,使用TryParse来处理故障情况,而不是异常处理.

最后,递归完全是错误的工具.问题必须具有以下特征才能通过递归来解决:

  • 一个简单的基础案例.
  • 可以减少到一组较小的问题.
  • 可以结合较小问题的解决方案来解决更大的问题.
  • 使问题反复变小,最终会导致琐碎的情况.

您的问题没有这些属性,因此递归自动是错误的工具.你想要的工具是一个循环.

static void Main()
{
    double x = ObtainDoubleFromUser(
        "Enter the side length of the cube: ", 
        "Please enter a number: ");
    Console.WriteLine("The volume is {0}", Cube(x));
}

static double ObtainDoubleFromUser(string firstMessage, string failureMessage)
{
    Console.Write(firstMessage);
    while(true)
    {
        double result;
        if (Double.TryParse(Console.Read(), out result))
            return result;
        Console.Write(failureMessage);
    }
}

static double Cube(double x)
{
    return Math.Pow(x, 3);
}
Run Code Online (Sandbox Code Playgroud)

这一切都有意义吗?如果可能,您希望避免递归和异常处理.并将您的疑虑分开.