选择语句 - if
、if-else
和 switch
if
、if-else
和 switch
语句根据表达式的值从多个可能的语句选择要执行的路径。 仅当提供的布尔表达式的计算结果为 true
时,if
,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!"); } }
不包含
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
语句使用以下模式:
重要
有关 switch
语句支持的模式的信息,请参阅模式。
上述示例还展示了 default
case。 default
case 指定匹配表达式与其他任何 case 模式都不匹配时要执行的语句。 如果匹配表达式与任何 case 模式都不匹配,且没有 default
case,控制就会贯穿 switch
语句。
switch
语句执行第一个 switch 部分中的语句列表,其 case 模式与匹配表达式匹配,并且它的 case guard(如果存在)求值为 true
。 switch
语句按文本顺序从上到下对 case 模式求值。 编译器在 switch
语句包含无法访问的 case 时会生成错误。 这种 case 已由大写字母处理或其模式无法匹配。
注意
default
case 可以在 switch
语句的任何位置出现。 无论其位置如何,仅当所有其他事例模式都不匹配或 goto default;
语句在其中一个 switch 节中执行时,default
才会计算事例。
可以为 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
语句传递出去。 还可使用 return 和 throw 语句将控制从 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# 语言规范
有关更多信息,请参阅 C# 语言规范的以下部分:
有关模式的详细信息,请参阅 C# 语言规范的模式和模式匹配部分。