c#语⾔swith的⽤法,C#switch语句MicrosoftDocs
switch(C# 参考)
04/09/2019
本⽂内容
本⽂介绍 switch 语句。 有关 switch 表达式(在 C# 8.0 中引⼊)的信息,请参阅 表达式和运算符部分中有关 switch 表达式的⽂章。
switch 是⼀个选择语句,它根据与匹配表达式匹配的模式,从候选列表中选择单个开关部分进⾏执⾏。
using System;
public class Example
{
public static void Main()
{
int caseSwitch = 1;
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
Console.WriteLine("Case 2");
break;
default:
Console.WriteLine("Default case");
break;
}
}
}
// The example displays the following output:
// Case 1
如果针对 3 个或更多条件测试单个表达式,switch 语句通常⽤作 if-else 构造的替代项。 例如,以下 switch 语句确定类型为 Color 的变量是否具有三个值之⼀:
using System;
public enum Color { Red, Green, Blue }
public class Example
{
public static void Main()
{
Color c = (Color) (new Random()).Next(0, 3); switch (c)
{
case Color.Red:
Console.WriteLine("The color is red"); break;
case Color.Green:
Console.WriteLine("The color is green"); break;
case Color.Blue:
writeline方法属于类Console.WriteLine("The color is blue"); break;
default:
Console.WriteLine("The color is unknown."); break;
}
}
}
它相当于使⽤ if-else 构造的以下⽰例。
using System;
public enum Color { Red, Green, Blue }
public class Example
{
public static void Main()
{
Color c = (Color) (new Random()).Next(0, 3); if (c == Color.Red)
Console.WriteLine("The color is red");
else if (c == Color.Green)
Console.WriteLine("The color is green");
else if (c == Color.Blue)
Console.WriteLine("The color is blue");
else
Console.WriteLine("The color is unknown.");
}
}
// The example displays the following output:
/
/ The color is red
匹配表达式
匹配表达式提供与 case 标签中的模式相匹配的值。 语法为:
switch (expr)
在 C# 6 及更低版本中,匹配表达式必须是返回以下类型值的表达式:
整数值,例如 int 或 long。
枚举值。
从 C# 7.0 开始,匹配表达式可以是任何⾮ null 表达式。
开关部分
switch 语句包含⼀个或多个开关部分。 每个 switch 部分包含⼀个或多个 case 标签(case 或 default 标签),后接⼀个或多个语句。switch 语句最多可包含⼀个置于任何 switch 部分中的 default 标签。 以下⽰例显⽰了⼀个简单的 switch 语句,该语句包含三个 switch 部分,每个部分包含两个语句。 第⼆个
switch 部分包含 case 2: 和 case 3: 标签。
switch 语句中可以包含任意数量的开关部分,每个开关部分可以具有⼀个或多个 case 标签,如以下⽰例所⽰。 但是,任何两个 case 标签不可包含相同的表达式。
using System;
public class Example
{
public static void Main()
{
Random rnd = new Random();
int caseSwitch = rnd.Next(1,4);
switch (caseSwitch)
{
case 1:
Console.WriteLine("Case 1");
break;
case 2:
case 3:
Console.WriteLine($"Case {caseSwitch}");
break;
default:
Console.WriteLine($"An unexpected value ({caseSwitch})");
break;
}
}
}
// The example displays output like the following:
// Case 1
switch 语句执⾏中只有⼀个开关部分。 C# 禁⽌从⼀个 switch 部分继续执⾏到下⼀个 switch 部分。 因此,下⾯的代码⽣成编译器错误CS0163:“控件不能从⼀个 case 标签 () 贯穿到另⼀个 case 标签。”
switch (caseSwitch)
{
// The following switch section causes an error.
case 1:
Console.WriteLine("");
// Add a break or other jump statement here.
case 2:
Console.WriteLine("... and/or Case 2");
break;
}
通常通过使⽤ break、goto 或 return 语句显式退出开关部分来满⾜此要求。 不过,以下代码也有效,因为它确保程序控制权⽆法贯穿到default switch 部分。
switch (caseSwitch)
{
case 1:
Console.WriteLine("");
break;
case 2:
case 3:
Console.WriteLine("... and/or Case 2");
break;
case 4:
while (true)
Console.WriteLine("Endless looping. . . .");
default:
Console.WriteLine("");
break;
}
在 case 标签与匹配表达式匹配的开关部分中执⾏语句列表时,先执⾏第⼀个语句,再执⾏整个语句列表,通常执⾏到跳转语句(如
break、goto case、goto label、return 或 throw)为⽌。 此时,控件在 switch 语句之外进⾏传输或传输到另⼀个 case 标签。 如果使⽤的是 goto 语句,必须将控制权移交给常量标签。 此限制是必要的,因为尝试将控制权移交给⾮常数标签可能会产⽣不良的副作⽤,如将控制权移交给代码中的意外位置,或创建⽆限循环。
Case 标签
每个 case 标签指定⼀个模式与匹配表达式(前⾯⽰例中的 caseSwitch 变量)进⾏⽐较。 如果它们匹配,则将控件传输到包含⾸次匹配case 标签的开关部分。 如果 case 标签模式与匹配表达式不匹配,控制权会转让给带 default case 标签的部分(若有)。 如果没有 default case,将不会执⾏任何 switch 部分中的语句,并且会将控制权转让到 switch 语句之外。
有关 switch 语句和模式匹配的信息,请参阅使⽤ switch 语句的 模式匹配部分。
因为 C# 6 仅⽀持常量模式且禁⽌重复常量值,所以 case 标签定义了互斥值,⽽且只能有⼀个模式与匹配表达式匹配。 因此,case 语句显⽰的顺序并不重要。
然⽽,在 C# 7.0 中,因为⽀持其他模式,所以 case 标签不需要定义互斥值,并且多个模式可以与匹配表达式相匹配。 因为仅执⾏包含匹配模式的⾸次开关部分中的语句,所以 case 语句显⽰的顺序很重要。 如果 C# 检测到开关部分的 case 语句或语句等效于或是先前语句的⼦集,它将⽣成编译错误 CS8120:“开关 case 已由先前 case 处理。”
以下⽰例说明了使⽤各种⾮互斥模式的 switch 语句。 如果你移动 case 0: switch 部分,使之不再是 switch 语句中的第⼀部分,C# 会⽣成编译器错误,因为值为零的整数是所有整数的⼦集(由 case int val 语句定义的模式)。
using System;
using System.Collections.Generic;
using System.Linq;
public class Example
{
public static void Main()
{
var values = new List();
for (int ctr = 0; ctr <= 7; ctr++) {
if (ctr == 2)
values.Add(DiceLibrary.Roll2());
else if (ctr == 4)
values.Add(DiceLibrary.Pass());
else
values.Add(DiceLibrary.Roll());
}
Console.WriteLine($"The sum of { values.Count } die is { DiceLibrary.DiceSum(values) }");
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论