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;
}

posted on   老菜农  阅读(56)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

统计信息

点击右上角即可分享
微信分享提示