選取範圍陳述式

Tip

本文屬於 基礎部分, 適合已經至少懂一種程式語言並正在學習 C# 的開發者。 如果你是程式新手,建議先從 入門 教學開始。 完整語法請參見語言參考中的 選擇語句

來自另一種語言? C++、Java 和 JavaScript 都與 C 有相同的淵源,因此 if, , elseswitch C# 中讀起來也是一樣的。 值得注意的一個差異是:C# 禁止在非空 switch 案例間切換,且每個 case 標籤可以測試 模式 ,而非僅是常數。 如果你原本使用 Python,C# 的 if/else if/else 對應到 if/elif/else,而 C# 以模式為基礎的 switch 最接近 Python 的 match 陳述。

選擇語句根據條件選擇執行的程式碼區塊。 C# 提供兩者:if(可選用 else)用於根據布林值進行分支,而 switch 則用於將某個值與多種情況進行比對。 布林表達式是任何求值結果為truefalse的表達式,例如 temperature >= 25 這樣的比較。

包含 ifelse 的分支

一個 if 陳述只有在其布林運算式為 true時才會執行其區塊。 新增一個 else 區塊,以提供當條件為 false時執行的程式碼:

int temperature = 28;

// An if statement runs its block only when the condition is true.
// The else block runs when the condition is false.
if (temperature >= 25)
{
    Console.WriteLine("Warm"); // => Warm
}
else
{
    Console.WriteLine("Cool");
}

ifelse 的主體是單一的 陳述式,例如指定作業或方法呼叫。 區塊陳述本身就是一個單一陳述,內含零個或多個陳述句的大括號({ })。

許多編碼標準建議即使只用一條語句,也要用大括號包圍分支主體。 牙套則能明確顯示範圍。 這可避免一個常見錯誤:後來再加入第二行時,原本預期它會有條件地執行,結果卻反而變成無條件執行。 只有大括號決定哪些語句屬於該分支。 C# 不把留白當成重要,所以單純的縮排從來不會有意義。 大括號即使只包住一行程式碼也是合法的:區塊就是該分支所執行的單一陳述式。 縮排程式碼以提升可讀性,但要依賴大括號來定義區塊。

使用 else if 測試多個條件

若要在多條路徑中選擇,需將條件鏈化為 else if。 C# 依序評估每個條件,並執行條件為 true的第一個區塊,然後跳過其餘區塊。 最後由 else 處理其餘所有情況:

int score = 82;

// Chain conditions with else if. The first branch whose condition is
// true runs; the compiler skips the rest.
string grade;
if (score >= 90)
{
    grade = "A";
}
else if (score >= 80)
{
    grade = "B";
}
else if (score >= 70)
{
    grade = "C";
}
else
{
    grade = "F";
}

Console.WriteLine(grade); // => B

秩序在鏈條中很重要。 因為第一個匹配條件勝出,請先列出最具體的條件。 在前述範例中,先測試 score >= 80 再測試 score >= 70,可確保 82 分會對應到 "B",而不是 "C"

將一個值與 switch 一個陳述匹配

當你將單一值與多個離散情況相比較時,switch 陳述式比冗長的 else if 鏈有更高的可讀性。 像 if,這個 switch 陳述句是一個分支陳述句:它選擇要執行哪段程式碼。 每個 case 標籤列出一個相符的值,每個 case 區段結尾則有陳述 break 句。 將標籤堆疊以共用同一個主體內容,並使用 default 區段來處理任何 case 都不符合的值:

DayOfWeek day = DayOfWeek.Saturday;

// A switch statement compares one value against several case labels.
// Stacked labels share a body. Each section ends with break, and the
// default section runs when no case matches.
switch (day)
{
    case DayOfWeek.Saturday:
    case DayOfWeek.Sunday:
        Console.WriteLine("Weekend"); // => Weekend
        break;
    default:
        Console.WriteLine("Weekday");
        break;
}

與 C 和 Java 不同,C# 不允許執行從一個非空case區段切換到下一個。 每個包含程式碼的區段必須以 break 一個(或其他跳轉語句,如 returngoto)結尾。 此規則可防止這些語言中常見的非預期穿透錯誤。

含有 casewhen 的測試模式

case標籤不限於恆定值。 它可以測試 一個模式,也就是描述資料形狀或價值的規則。 像是 < 0 這樣的關係模式符合任何小於零的值。 加入一個 when 子句,以附加一個額外條件;該條件也必須為 true,情況才會符合條件:

int measurement = 42;

// A case label can test a pattern instead of a constant. A when clause
// adds a condition that must also be true for the case to match.
switch (measurement)
{
    case < 0:
        Console.WriteLine("Negative");
        break;
    case 0:
        Console.WriteLine("Zero");
        break;
    case > 0 when measurement % 2 == 0:
        Console.WriteLine("Positive and even"); // => Positive and even
        break;
    default:
        Console.WriteLine("Positive and odd");
        break;
}

以模式為基礎的案例會從上到下評估,因此較具體的模式應該排在更一般的案例之前。 完整圖樣目錄請參見 圖樣匹配

選擇一個帶有表達式的值

ifswitch陳述句決定執行哪段程式碼。 當你需要選擇 一個值時,可以使用 表達式。 表達式會求得一個值,因此你可以在任何需要值的地方使用它,例如賦值運算的右側或作為方法引數。 C# 提供從條件運算子和 switch 表達式等替代方案中選擇值的表達式形式。

條件運算子 ?:

條件運算 ?: 子根據布林條件選擇兩個值之一。

關於其語法、短路行為,以及選擇它而非 if/else的指引,請參見 條件運算子 ?:

switch 表示式

switch 運算式是 switch 陳述式所對應的運算式。 它不再執行匹配案例的程式碼,而是評估為一個值。 這比在 switch 陳述式的每個分支中指派值更簡潔,而且如果各分支未涵蓋所有可能的輸入,編譯器也會提出警告。 這個 switch 表達式是模式匹配的核心部分。 若要了解何時以及如何使用它,請參閱 模式比對switch 運算式 參考。

參見