当您想针对三个或更多条件测试变量时,可以使用 switch 语句代替 if else 语句。 在这里,您将了解 switch 语句以及如何在 C# 程序中有效地使用它。
以下是switch语句的一般语法
switch(匹配表达式/变量的值)
{
case 常量:
一些语句
break;
case 常量2:
一些语句
break;
default:
一些语句
break;
}
switch 是一个选择语句,它根据与匹配表达式匹配的模式,从候选列表中选择单个开关部分进行执行。
每个 case 包含一个或多个要执行的语句。 如果常量值和 匹配表达式/变量的值相等,则将执行该case下的语句。 switch还可以包含一个可选的default case。 如果上面的的条件都没有满足,则会执行 default里的语句。 可以使用 break, return , goto
跳出 switch
以下示例演示了一个简单的 switch 语句。
int x = 10;
switch (x)
{
case 5:
Console.WriteLine("Value of x is 5");
break;
case 10:
Console.WriteLine("Value of x is 10");
break;
case 15:
Console.WriteLine("Value of x is 15");
break;
default:
Console.WriteLine("Unknown value");
break;
}
输出
Value of x is 10
上面,该语句包含一个变量x,其值将与每个 case 值的值相匹配。 上面的语句包含三个具有常量值 5、10 和 15 的 case。它还包含默认标签,如果没有 case 值与 switch 变量/表达式匹配,则将执行默认标签。 每个case后都包含了一个要执行的语句。 X的值是5与第二种情况匹配,因此输出将为 Value of x is 10
该语句还可以包含一个表达式,其结果将在运行时针对每种情况进行测试。
int x = 125;
switch (x % 2)
{
case 0:
Console.WriteLine($"{x} is an even value");
break;
case 1:
Console.WriteLine($"{x} is an odd Value");
break;
}
输出
125 is an odd value
switch case 必须是唯一的常量值。 它可以是 bool、char、string、integer、enum 或相应的可空类型。
在 C# 7.0之后不在要求唯一值。 有一些case需要执行相同的语句,这个时候可以把它们合并在一起。 例始下面的 4 和 5
int x = 5;
switch (x)
{
case 1:
Console.WriteLine("x = 1");
break;
case 2:
Console.WriteLine("x = 2");
break;
case 4:
case 5:
Console.WriteLine("x = 4 or x = 5");
break;
default:
Console.WriteLine("x > 5");
break;
}
输出
x = 4 or x = 5
使用return来退出的示例
static void Main(string[] args)
{
int x = 125;
Console.Write( isOdd(x)? "Even value" : "Odd value");
}
static bool isOdd(int i, int j)
{
switch (x % 2)
{
case 0:
return true;
case 1:
return false;
default:
return false;
}
return false;
}
输出
Odd value
每个 case 必须通过使用 break 语句或其他方式显式退出 case.如果漏写了break.或者其它退出case的语句。编译器会报错 CS0163 控制不能从一个 case 标签(“case 5:”)贯穿到另一个 case 标签 如下示例
int x = 5;
switch (x)
{
case 1:
Console.WriteLine("x = 1");
break;
case 2:
Console.WriteLine("x = 2");
break;
case 4:
case 5:
Console.WriteLine("x = 4 or x = 5");
//这边忘记退出case了
default:
Console.WriteLine("x > 5");
break;
}
嵌套的 Switch 语句 一个语句可以在另一个语句中使用。
int j = 5;
switch (j)
{
case 5:
Console.WriteLine(5);
switch (j - 1)
{
case 4:
Console.WriteLine(4);
switch (j - 2)
{
case 3:
Console.WriteLine(3);
break;
}
break;
}
break;
case 10:
Console.WriteLine(10);
break;
case 15:
Console.WriteLine(15);
break;
default:
Console.WriteLine(100);
break;
}
输出
5
4
3
public record Order(int Items, decimal Cost);
public decimal CalculateDiscount(Order order) =>
order switch
{
{ Items: > 10, Cost: > 1000.00m } => 0.10m,
{ Items: > 5, Cost: > 500.00m } => 0.05m,
{ Cost: > 250.00m } => 0.02m,
null => throw new ArgumentNullException(nameof(order), "Can't calculate discount on null order"),
var someObject => 0m,
};
//如果有 order 有定义了 Deconstruct 析构元组的方法还可以写得更简单
public decimal CalculateDiscount(Order order) =>
order switch
{
( > 10, > 1000.00m) => 0.10m,
( > 5, > 50.00m) => 0.05m,
{ Cost: > 250.00m } => 0.02m,
null => throw new ArgumentNullException(nameof(order), "Can't calculate discount on null order"),
var someObject => 0m,
};
要记住的点: