switch case语句和枚举

switch case 语句是另一种条件分支语句,它在一定程度上也能用if代替。但是呢,switch更方便列举所有可能的情况,看起来更直观

而枚举呢,正是用来给各种可能的情况命名的,二者非常适合放在一起介绍。


一、switch - case 语句

switch-case 语句是另一种条件判断语句。

其格式为:

switch(变量或值)
{
    case 第一种情况:
        //一些操作
        break;
    case 第二种情况:
        //另一些操作
        break;
    // case .....列举其他更多情况
    default:        //如果以上情况均不满足
       //默认的操作
       break;                    
}

switch举例:

string s = Console.ResadLine();

switch(s)
{
     case "a":
                    Console.WriteLine("攻击");
                    break;
                case "b":
                    Console.WriteLine("防御");
                    break;
                default:
                    Console.WriteLine("逃跑");
                    break;
}

用if对比:

string s = Console.ReadLine();

if (s == "a")        //第一种情况
{
    Console.WriteLine("攻击");
}
else if(s == "b")    //第二种情况
{
    Console.WriteLine(“防御");
}
else                 //以上情况均不满足
{
    Console.WriteLine("逃跑");
}

二者的结果相同。

从这里可以看出,在写switch时,这里不用相等性的判断。它的好处呢是更为简洁,但是坏处是不能把一些复杂的布尔表达式,放在括号里的位置。


/*写一个计算器程序。
             1 提示用户先输入第一个数字,再第二个数字。
             2 提示用户输入“+”、“-”、“*”或“/”四种运算之一。
             3 根据输入的符号,打印两个数字运算后的结果。这一步请使用switch-case语句实现。
             4 如果用户输入的运算符错误,提示输入错误。*/
            while (true)
            {
                Console.WriteLine("请输入第一个数字:");
                string input = Console.ReadLine();
                int a = int.Parse(input);

                Console.WriteLine("请输入第二个数字:");
                input = Console.ReadLine();
                int b = int.Parse(input);

                Console.WriteLine("请输入一个运算符号(加减乘除):");
                string sign = Console.ReadLine();

                double result = 0;
                switch (sign)
                {
                    case "+":
                        result = a + b;
                        break;
                    case "-":
                        result = a - b;
                        break;
                    case "*":
                        result = a * b;
                        break;
                    case "/":
                        result = (double)a / b;
                        break;
                    default:
                        Console.WriteLine("输入错误");
                        Console.WriteLine();
                        Console.WriteLine();
                        return;     //可以直接终止程序。
                }
                //打印结果
                Console.WriteLine($"{a}{sign}{b}的结果是:{result}");
                Console.WriteLine();
                Console.WriteLine();

            }

上述案例呢实现了计算器的基本用法,通过“return”指令,输错则程序直接终止。而return的本意是退出当前函数,当前默认是有且仅有Main函数,所以程序直终止

那么,想要实现输入错误后直接重新输入,我们就需要更换return指令,退出循环并立即开始下一次循环。这里可以用continue指令,直接进入下一次循环。


二、switch的特点

·虽然if可以代替switch-case, 但在实际开发中switch-case语句很常用

·switch-case语句有几个特点:

1、直接跳转到对应情况,程序执行速度更快。(if会依次判断){若情况3不满足if,则判断else if...以此类推;而switch 可以直接跳转到情况3对应的case3 }

2、不能处理复杂的条件判断,需要复杂条件判断时用if更合适。

3、代码结构清晰,和枚举配合使用很容易读懂。


三、为什么要使用枚举?

·一般,可以用数字编号或者字符串等表示各种事物。

·例如当编写石头剪刀布的程序时,可以用1代表石头,2代表剪刀,3代表布。你会发现,用123在代替剪刀石头布非常不直观,当变量多时很容易搞错。因此需要枚举提供直观的编号。

例如我们想要定义春夏秋冬。

enum 季节        //enum为枚举
    {
        春,
        夏,
        秋,
        冬,
    }

如此一来当我们需要调用时,可以这样:

季节 season = 季节.春;

你会发现,变量season前的变量类型不再是int,string,double等,而是“季节”。这是因为我们优先将季节定义成一种类型,这是一种枚举类型,而其取值只能是春夏秋冬。

值得注意的是,enum中所定义的编号,背后都有对应的整数,默认第一个是0,之后顺次递增,即春代表0,夏代表1,秋代表2,冬代表3。


季节 season = 季节.春;

            Console.WriteLine("请输入季节(1234)");
            string input = Console.ReadLine();

            //将input字符串转为数字
            int n = int.Parse(input);
            //将数字转化为枚举
            season = (季节)n;

            Console.WriteLine("season = " +  (int)season);

            switch (season)
            {
                case 季节.春:
                    Console.WriteLine("这是春天");
                    break;
                case 季节.夏:
                    Console.WriteLine("这是夏天");
                    break;
                case 季节.秋:
                    Console.WriteLine("这是秋天");
                    break; 
                case 季节.冬:
                    Console.WriteLine("这是冬天");
                    break;
            }