C#学习笔记 -- switch

发布时间 2023-05-24 16:48:45作者: Phonk

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