C#快速入門教程(13)—— switch語句結構

曹化宇發表於2018-09-24

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軟體小屋原創作品!

相關文章