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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律