選取陳述式:ifif-elseswitch

ifif-elseswitch 陳述式會根據運算式的值,選取要從許多可能路徑執行的陳述式。 只有當提供的布林運算式評估為 true 時,if 陳述式才會執行陳述式。 if-else 陳述式可讓您根據布林運算式,從要遵循的兩個程式碼路徑中選擇其中之一。 switch 陳述式會根據與運算式的模式比對,選取要執行的陳述式清單。

if 陳述式

if 陳述式可以是下列兩種格式之一:

  • 具有 else 部分的 if 陳述式會根據布林運算式的值選取兩個陳述式之一,如下列範例所示:

    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!");
        }
    }
    
  • 只有布林運算式評估為 true 時,沒有 else 組件的 if 陳述式才會執行其主體,如下列範例所示:

    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 陳述式會在第一個switch 區段中執行陳述式清單,其案例模式符合比對運算式,且其案例成立條件評估為 true (如果存在)。 switch 陳述式會評估文字順序從上到下的大小寫模式。 當 switch 陳述式包含無法連線的情況時,編譯器會產生錯誤。 這是已由大寫處理或無法比對其模式的情況。

注意

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

您可以為 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 陳述式中,控制項無法從一個參數區段到下一個參數區段。 如本節所示的範例,您通常會在每個參數區段結尾使用 break 陳述式,將控制權傳出 switch 陳述式。 您也可以使用 returnthrow 陳述式,將控制權傳出 switch 陳述式。 若要模擬中斷行為並將控制權傳遞至其他 switch 區段,您可以使用goto 陳述式

在運算式內容中,您可以使用 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# 語言規格模式和模式比對一節。

另請參閱