Selection 語句 - ifif-elseswitch

if if-else、 和 switch 語句會根據表達式的值,從多種可能路徑中選擇要執行的語句。 if 只有當提供的布爾表示式評估為 true時,語句才會執行 語句。 這個 if-else 語句 讓你可以根據布林運算式選擇兩條程式碼路徑中的哪一條。 語句switch會根據與表達式的模式比對,選取要執行的語句清單。

C# 語言參考資料記錄了 C# 語言最新版本。 同時也包含即將推出語言版本公開預覽功能的初步文件。

文件中標示了語言最近三個版本或目前公開預覽版中首次引入的任何功能。

小提示

欲查詢某功能何時首次在 C# 中引入,請參閱 C# 語言版本歷史的條目。

if 陳述式

if語句可以是下列兩種形式之一:

  • if具有else部分的語句會根據布爾表達式的值選取要執行的兩個語句之一,如下列範例所示:

    DisplayWeatherReport(15.0);  // Output: Cold.
    DisplayWeatherReport(24.0);  // Output: Perfect!
    
    void DisplayWeatherReport(double tempInCelsius)
    {
        if (tempInCelsius < 20.0)
        {
            Console.WriteLine("Cold.");
        }
        else
        {
            Console.WriteLine("Perfect!");
        }
    }
    
  • if只有布爾表達式評估為 else時,沒有true元件的語句才會執行其主體,如下列範例所示:

    DisplayMeasurement(45);  // Output: The measurement value is 45
    DisplayMeasurement(-3);  // Output: Warning: not acceptable value! The measurement value is -3
    
    void DisplayMeasurement(double value)
    {
        if (value < 0 || value > 100)
        {
            Console.Write("Warning: not acceptable value! ");
        }
    
        Console.WriteLine($"The measurement value is {value}");
    }
    

您可以巢狀 if 語句來檢查多個條件,如下列範例所示:

DisplayCharacter('f');  // Output: A lowercase letter: f
DisplayCharacter('R');  // Output: An uppercase letter: R
DisplayCharacter('8');  // Output: A digit: 8
DisplayCharacter(',');  // Output: Not alphanumeric character: ,

void DisplayCharacter(char ch)
{
    if (char.IsUpper(ch))
    {
        Console.WriteLine($"An uppercase letter: {ch}");
    }
    else if (char.IsLower(ch))
    {
        Console.WriteLine($"A lowercase letter: {ch}");
    }
    else if (char.IsDigit(ch))
    {
        Console.WriteLine($"A digit: {ch}");
    }
    else
    {
        Console.WriteLine($"Not alphanumeric character: {ch}");
    }
}

在表達式情境中,使用 條件運算 ?: 子根據布林表達式的值來評估兩個表達式中的一個。

switch 陳述式

switch 語句根據與匹配表達式的模式匹配選擇一系列要執行的語句,如下範例所示:

DisplayMeasurement(-4);  // Output: Measured value is -4; too low.
DisplayMeasurement(5);  // Output: Measured value is 5.
DisplayMeasurement(30);  // Output: Measured value is 30; too high.
DisplayMeasurement(double.NaN);  // Output: Failed measurement.

void DisplayMeasurement(double measurement)
{
    switch (measurement)
    {
        case < 0.0:
            Console.WriteLine($"Measured value is {measurement}; too low.");
            break;

        case > 15.0:
            Console.WriteLine($"Measured value is {measurement}; too high.");
            break;

        case double.NaN:
            Console.WriteLine("Failed measurement.");
            break;

        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

在前述範例中,該 switch 陳述使用以下模式:

這很重要

如需 語句所支援 switch 之模式的資訊,請參閱 模式

上述範例也會示範此 default 案例。 當比對表達式不符合任何其他案例模式時,案例 default 會指定要執行的語句。 如果比對表達式不符合任何案例模式,而且沒有任何 default 案例,則控件會通過 switch 語句。

語句會在第一個switch參數區段中執行語句清單,其案例模式符合相符表達式,如果存在,則其案例防護會評估為 trueswitch語句會根據文字順序從上到下評估案例模式。 當語句包含無法連線的情況時 switch ,編譯程式會產生錯誤。 當大寫已經處理該大寫或無法匹配模式時,就會發生這種錯誤。

備註

default 案例可以出現在語句中的任何 switch 位置。 不論其位置為何, default 只有在所有其他案例模式不相符或 goto default; 語句在其中一個 switch 區段中執行時,才會評估案例。

您可以為 語句的一個 switch 區段指定多個案例模式,如下列範例所示:

DisplayMeasurement(-4);  // Output: Measured value is -4; out of an acceptable range.
DisplayMeasurement(50);  // Output: Measured value is 50.
DisplayMeasurement(132);  // Output: Measured value is 132; out of an acceptable range.

void DisplayMeasurement(int measurement)
{
    switch (measurement)
    {
        case < 0:
        case > 100:
            Console.WriteLine($"Measured value is {measurement}; out of an acceptable range.");
            break;
        
        default:
            Console.WriteLine($"Measured value is {measurement}.");
            break;
    }
}

switch在語句中,控件無法從一個參數區段跌至下一個參數區段。 如本節中的範例所示,您通常會在每個 switch 區段結尾使用 break 語句,將控制權傳出 switch 語句。 您也可以使用 returnthrow 語句,將控制權傳出 switch 語句。 若要模仿遞歸行為,並將控制權傳遞至其他 switch 區段,您可以使用 goto 語句

這很重要

每個 開關區段 必須以 breakgotoreturn結尾。 從一個參數區段跌至下一個參數區段會產生編譯程序錯誤。 不過,你可以像前面範例一樣,對同一開關區 case < 0: 段套用多個開關標籤。 這種刻意的設計選擇可讓您簡潔地處理共用相同或相互相依邏輯的多個案例。

在表達式內容中switch,您可以使用 表達式,根據與表達式的模式比對,從候選表達式清單中評估單一表達式。

這很重要

switch 運算式switch 語句之間的差異:

  • switch 語句 是用來控制程式碼區塊內的執行流程。
  • 切換表達 式通常用於值回傳與值賦值的情境中,常作為 表達式實體成員
  • 切換式表達式格段不能是空的,但切換語句格段可以。

案例防護

一個格狀模式可能不夠具表達力,無法明確指定切換區段執行的條件。 這種情況下,使用 護殼。 必須同時符合匹配的模式。 案例防護必須是布爾表達式。 在關鍵字後 when 指定一個遵循模式的大寫保護,如下範例所示:

DisplayMeasurements(3, 4);  // Output: First measurement is 3, second measurement is 4.
DisplayMeasurements(5, 5);  // Output: Both measurements are valid and equal to 5.

void DisplayMeasurements(int a, int b)
{
    switch ((a, b))
    {
        case (> 0, > 0) when a == b:
            Console.WriteLine($"Both measurements are valid and equal to {a}.");
            break;

        case (> 0, > 0):
            Console.WriteLine($"First measurement is {a}, second measurement is {b}.");
            break;

        default:
            Console.WriteLine("One or both measurements are not valid.");
            break;
    }
}

上述範例會使用具有巢狀關係模式的位置模式

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

如需模式的詳細資訊,請參閱 C# 語言規格模式和模式比對一節。

另請參閱