switch语句结构,称为开关语句或选择语句,其应用特点是:当有一个数据可能有多个值时,可以根据不同的值进行不同的操作。

回想一下前一课,使用if语句结构判断方向的示例,实际上,这种情况下就可以使用switch语句结构,其基本格式如下:

switch(<数据>)
{
    case <值1>:
    {
        <语句块1>
    }break;
    case <值2>:
    {
        <语句块2>
    }break;
    case <值N>:
    {
        <语句块N>
    }break;
    default:
    {
        <语句N+1>
    }break;
}

这里,<数据>是可能的数据表达式,一般使用整数或枚举值进行处理;当<数据>的值是<值1>时执行<语句块1>,当<数据>的值是<值2>时执行<语句块2>,当<数据>的值是<值N>时执行<语句块N>;当所有值都不是时,执行default语句块中的<语句块N+1>。请注意,在这里,每个case和default语句块后都会使用break语句作为结束。

下面的代码,我们使用switch语句结构实现方向的判断。

static void Main(string[] args)
{
int dir = 1;
switch (dir)
{
        case 1:
        {
              Console.WriteLine("上");
       }
       break;
       case 2:
       {
            Console.WriteLine("右");
        }
        break;
        case 3:
        {
            Console.WriteLine("下");
        }
        break;
        case 4:
        {
            Console.WriteLine("左");
        }
        break;
        default:
        {
            Console.WriteLine("未知方向");
        }
        break;
    }
}

实际上,在case或default语句块后的代码块并不是真的需要一对花括号,本课中的代码只是想区分实际执行代码和break语句的应用,去掉花括号的代码如下。

static void Main(string[] args)
{
    int dir = 1;
    switch (dir)
    {
            case 1:
                Console.WriteLine("上");
                break;
            case 2:
                Console.WriteLine("右");
                break;
            case 3:
                Console.WriteLine("下");
                break;
            case 4:
                Console.WriteLine("左");
                break;
        default:
            Console.WriteLine("未知方向");
        break;
    }
}

另一个需要注意的地方。我们从示例中可以看到,每个case语句块都是一个可能的数据值,当执行相应的代码后,应使用break语句跳出case语句块,同时也结束switch语句结构的执行。那么,case语句块后没有break语句会怎么样呢?先看下面的代码。

static void Main(string[] args)
{
    int year = 2016;
    int month = 2;
    int days = 0;
    switch (month)
    {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                days = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                days = 30;
                break;
            case 2:
                if (DateTime.IsLeapYear(year))
                    days = 29;
                else
                    days = 28;
                break;
            default:
                days = -1;
                break;
        }
        Console.WriteLine("{0}年{1}月有{2}天", year, month, days);
}

大家可以看出,此代码的功能是返回每个月份的天数,其中,1、3、5、7、8、10、12月为大月,每月有31天;4、6、9、11为小月,每月有30天;而2月则需要判断当年是否为闰年,闰年时有29天,否则有28天。本例中,我们正是利用了case语句块没有break语句的特点,即向下贯穿执行,如值是1时没有执行代码,会执行3值,此时也没有代码,则一直执行到值是12的代码,并通过break语句结束,这就是switch语句结构中的自动贯穿特性。

友情提示:.NET Framework类库真的很厉害,计算某月份的天数时,可以使用DateTime.DaysInMonth()方法,如下面的代码。

static void Main(string[] args)
{
        int year = 2016;
        int month = 2;
        int days = DateTime.DaysInMonth(year,month);
        Console.WriteLine("{0}年{1}月有{2}天", year, month, days);
 }

实际开发中,请注意区别if语句和switch语句的应用特点,并能够合理选择这两种判断语句结构。if语句结构多用于不同的数据量判断,而switch语句则用于相同的数据量,但可能有多个值的情况下。

CHY软件小屋原创作品!