C#学习笔记 -- switch
switch
case标签由关键字case和其后面的模式构成
-
模式可以是简单地值
-
也可以是简单值的表达式
-
也可以是一个类型
-
可以使用关键字when来包含一个过滤器
case Square square when square.Side > 3: Console.WriteLine($"多边形, 且边数为: {square.Side}"); break;
-
其中square是匹配变量, 匹配变量会被switch括号里的shap复制, 每个此类变量都是在自己的范围内, 到下个跳转语句(break), 不会在任何其他块的范围内
-
如果在同一个分支块中存在多个类型模式, 则无法在编译时确定将匹配哪个模式, 也无法确定填充哪个变量
case Square s: case Cricle c: Console.WriteLine($"多边形, 边数: {s.Side}"); Console.WriteLine($"圆形, 且半径为: {c.Radius}");
-
不必在所有的case表达式中都只使用常量值或常量类型, 可以将他们混合在一起
-
-
如果某个case是上一个case的受限case, 会产生编译异常
-
末尾case必须要设置脱离分支语句, break return throw异常均可
public abstract class Shape
{
}
public class Square : Shape
{
public double Side
{ set; get; }
}
public class Circle : Shape
{
public double Radius
{ get; set; }
}
public class Trangle : Shape
{
public double Height
{ set; get; }
}
static void Main(string[] args)
{
List<Shape> shapes = new List<Shape>();
shapes.Add(new Circle() { Radius = 7 });
shapes.Add(new Square() { Side = 5 });
shapes.Add(new Trangle() { Height = 7 });
shapes.Add((Shape) null);
foreach (Shape shape in shapes)
{
switch (shape)
{
case Circle circle:
Console.WriteLine($"圆形, 且半径为: {circle.Radius}");
break;
case Square square when square.Side > 3:
Console.WriteLine($"多边形, 且边数为: {square.Side}");
break;
case Trangle trangle:
Console.WriteLine($"三角形, 且高为: {trangle.Height}");
break;
case null:
Console.WriteLine("啥都没有");
break;
default:
throw new ArgumentException(message: "不是任何形状", paramName: nameof(shapes));
}
}
}
switch分支标签
-
尽管不允许从一个分支直接进入另一个分支, 可以把多个分支标签附加到任意分支, 只要这些分支标签之间没有插入可执行语句, 代表这些case都可以被接受
static void main(string[] args)
{
int x = 1;
switch(x)
{
case 1:
case 2:
case 3:
Console.WriteLine("1, 2, 3都可以");
break;
default:
Console.WriteLine("没事");
break;
}
}
//1, 2, 3都可以
-
当某个结构可以使语句列表满足不穿过规则, 比如下列, 永远循环, 永远不会进入下一个分支块, 编译器不会报错
int x = 5;
switch(x)
{
case 5:
while(true)
Console.WriteLine("死循环");
default:
Console.WriteLine("没事");
break;
}