选择语句(C# 参考)

以下语句根据表达式的值从多个可能的语句选择要执行的语句:

  • if 语句:根据布尔表达式的值来选择要执行的语句。
  • 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!");
        }
    }
    
  • 不包含 else 部分的 if 语句仅在布尔表达式计算结果为 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 语句使用以下模式:

  • 关系模式(在 C# 9.0 及更高版本中可用):将表达式结果与常量进行比较。
  • 常量模式(在 C# 7.0 及更高版本中可用):测试表达式结果是否等于常量。

重要

有关 switch 语句支持的模式的信息,请参阅模式

上述示例还展示了 default case。 default case 指定匹配表达式与其他任何 case 模式都不匹配时要执行的语句。 如果匹配表达式与任何 case 模式都不匹配,且没有 default case,控制就会贯穿 switch 语句。

switch 语句执行第一个 switch 部分中的语句列表,其 case 模式与匹配表达式匹配,并且它的 case guard(如果存在)求值为 trueswitch 语句按文本顺序从上到下对 case 模式求值。 编译器在 switch 语句包含无法访问的 case 时会生成错误。 这种 case 已由大写字母处理或其模式无法匹配。

注意

default case 可以在 switch 语句的任何位置出现。 不管在哪个位置,default case 总是最后计算的,并且仅在其他所有 case 模式都不匹配时计算。

可以为 switch 语句的一部分指定多个 case 模式,如以下示例所示:

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 部分贯穿到下一个 switch 部分。 如本部分中的示例所示,通常使用每个 switch 部分末尾的 break 语句将控制从 switch 语句传递出去。 还可使用 returnthrow 语句将控制从 switch 语句传递出去。 若要模拟贯穿行为,将控制传递给其他 switch 部分,可使用 goto 语句

在表达式上下文中,可使用 switch 表达式,根据与表达式匹配的模式,对候选表达式列表中的单个表达式进行求值。

Case guard

case 模式可能表达功能不够,无法指定用于执行 switch 部分的条件。 在这种情况下,可以使用 case guard。 这是一个附加条件,必须与匹配模式同时满足。 case guard 必须是布尔表达式。 可以在模式后面的 when 关键字之后指定一个 case guard,如以下示例所示:

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# 7.0 开始,switch 语句支持模式匹配。 此后,每个主要 C# 版本都会添加新类型的模式。 有关详细信息,请参阅模式

在 C# 6 及更早版本中,使用 switch 语句时有以下限制:

C# 语言规范

有关更多信息,请参阅 C# 语言规范的以下部分:

若要详细了解 C# 7.0 及更高版本中引入的功能,请参阅以下功能建议说明:

请参阅