选择语句 - ifif-elseswitch

if-elseifswitch语句根据表达式的值从许多可能的路径中选择要执行的语句。 仅当提供的布尔表达式的计算结果为true时,该if语句才会执行语句。 该 if-else 语句 允许你根据布尔表达式选择要遵循的两个代码路径中的哪一个。 该 switch 语句 根据与表达式的模式匹配选择要执行的语句列表。

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仅当布尔表达式的计算结果为true时,没有else部件的语句才会执行其正文,如以下示例所示:

    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 模式的信息,请参阅 Patterns

前面的示例还演示了这种情况 default 。 此 default 事例指定匹配表达式与任何其他事例模式不匹配时要执行的语句。 如果匹配表达式与任何大小写模式不匹配,则 default 控件将贯穿于语句中 switch

语句switch在第一个 switch 节中执行语句列表,其大小写模式与匹配表达式匹配,如果存在,则其事例防护的计算结果为 true。 语句 switch 按文本顺序从上到下计算大小写模式。 当语句包含无法访问的情况时 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在语句中,控件无法从一个开关部分下降到下一个开关部分。 如本节中的示例所示,通常使用 break 每个 switch 节末尾的语句将控制权传出 switch 语句。 还可以使用 returnthrow 语句将控制权传出 switch 语句。 若要模仿倒入行为并将控制权传递给其他 switch 节,可以使用goto语句

重要

每个 开关节 必须以 a breakgotoreturn。 从一个开关部分下降到下一个开关部分会产生编译器错误。 但是,可以将多个开关标签应用于同一开关部分,如 case < 0: 上面的示例。 这种故意的设计选择允许简明地处理共享相同或相互依赖的逻辑的多个事例。

在表达式上下文中switch,可以使用表达式根据与表达式的模式匹配从候选表达式列表中计算单个表达式。

重要

switch 表达式switch 语句之间的差异:

  • 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# 语言规范模式和模式匹配部分。

另请参阅