Skip to content

C# - 决策语句

决策结构是编程逻辑的基石。它们允许程序评估条件,并根据这些条件是 true(真)还是 false(假)来执行不同的代码块。这使得应用程序能够实现动态和响应式的行为。

决策的基本流程是:

1. 测试一个条件。
2. 如果条件为真(TRUE),执行特定的代码块。
3. 如果条件为假(FALSE),执行不同的代码块(或者什么也不做)。
4. 继续程序的其余部分。

C# 提供了一组强大的语句来处理条件逻辑。

语句描述
if如果指定条件为真,则执行一个代码块。
if…else如果条件为真,执行一个代码块;如果条件为假,则执行另一个代码块。
if…else if…else按顺序测试一系列条件,并执行第一个为真的条件。
switch根据与表达式的模式匹配,选择要执行的多个代码块之一。
三元运算符(?:)一个返回值的 if...else 语句的简写形式。

这些是最常见的决策语句。它们用于根据一个或多个布尔条件来控制程序流程。

这个示例检查当前温度并提供不同的反馈。请注意 else if 块中清晰的逻辑和修正的条件。

using System;
public class WeatherReport
{
public static void Main()
{
int temperature = 20;
if (temperature < 0)
{
Console.WriteLine("It's freezing outside!");
}
else if (temperature < 15)
{
Console.WriteLine("It's a cold day. Wear a jacket.");
}
else if (temperature >= 15 && temperature < 25)
{
Console.WriteLine("The weather is pleasant.");
}
else // temperature >= 25
{
Console.WriteLine("It's a hot day. Stay hydrated!");
}
Console.WriteLine($"Execution complete. Current temperature was: {temperature}°C");
}
}

如果你编译并执行 temperature = 20 的代码,结果是:

The weather is pleasant.
Execution complete. Current temperature was: 20°C

当你需要针对多个可能值测试单个变量或表达式时,switch 语句是理想选择。现代 C# 通过模式匹配显著增强了 switch 语句,并引入了更简洁的 switch 表达式。

using System;
public class DayOfWeekPrinter
{
public static void PrintDay(int day)
{
switch (day)
{
case 1:
Console.WriteLine("Monday");
break;
case 2:
Console.WriteLine("Tuesday");
break;
case 3:
Console.WriteLine("Wednesday");
break;
case 4:
Console.WriteLine("Thursday");
break;
case 5:
Console.WriteLine("Friday");
break;
case 6:
case 7:
Console.WriteLine("It's the Weekend!");
break;
default:
Console.WriteLine("Invalid day number!");
break;
}
}
}

示例:现代 switch 表达式 (C# 8.0+)

Section titled “示例:现代 switch 表达式 (C# 8.0+)”

switch 表达式提供了更具函数式且更简洁的语法,非常适合根据条件进行赋值。

public static string GetDayName(int day)
{
string dayName = day switch
{
1 => "Monday",
2 => "Tuesday",
3 => "Wednesday",
4 => "Thursday",
5 => "Friday",
6 or 7 => "Weekend", // 'or' 模式
_ => "Invalid day" // _ 是弃元/默认情况
};
return dayName;
}

示例:带模式匹配的 switch (C# 9.0+)

Section titled “示例:带模式匹配的 switch (C# 9.0+)”

模式匹配允许基于类型和属性值进行切换,使其功能极其强大。

public decimal CalculateToll(object vehicle)
{
return vehicle switch
{
Car c when c.Passengers == 0 => 2.00m + 0.50m, // 没有乘客的汽车
Car c when c.Passengers == 1 => 2.00m,
Car c when c.Passengers == 2 => 2.00m - 0.50m,
Car _ => 2.00m - 1.00m, // 任何其他汽车
Taxi t => 3.50m,
Bus b => 5.00m,
{ } => 4.00m, // 任何其他非空对象
null => throw new ArgumentNullException(nameof(vehicle))
};
}
// 示例的模拟类
public class Car { public int Passengers { get; set; } }
public class Taxi { }
public class Bus { }

三元运算符是一种紧凑的内联 if-else 语句。它接受三个操作数:condition ? value_if_true : value_if_false。

int userAge = 21;
// 使用 if-else
string status;
if (userAge >= 18)
{
status = "Adult";
}
else
{
status = "Minor";
}
// 使用三元运算符 - 更简洁
string ternaryStatus = userAge >= 18 ? "Adult" : "Minor";
Console.WriteLine($"Status from if-else: {status}");
Console.WriteLine($"Status from ternary: {ternaryStatus}");
  • 清晰是关键:对于复杂的逻辑块,优先使用 if-else。三元运算符仅用于简单、短小的赋值。
  • 避免深度嵌套:深度嵌套的 if 语句难以阅读和调试。将其重构为单独的方法或使用不同的控制结构。
  • 对多值情况使用 switch:如果你将单个变量与 3 个或更多常量值进行比较,switch 语句或表达式通常比冗长的 if-else if 链更清晰。
  • 拥抱模式匹配:对于现代 C# 开发,学习并使用 switch 的模式匹配。它可以显著简化复杂的条件逻辑。