首页 > 其他分享 >switch 表达式 - 使用 switch 关键字的模式匹配表达式

switch 表达式 - 使用 switch 关键字的模式匹配表达式

时间:2024-04-20 22:44:22浏览次数:28  
标签:Direction Point direction switch 表达式 var 模式匹配

switch 表达式 - 使用 switch 关键字的模式匹配表达式

 

本文内容

  1. Case guard
  2. 非详尽的 switch 表达式
  3. C# 语言规范
  4. 另请参阅

可以使用 switch 表达式,根据与输入表达式匹配的模式,对候选表达式列表中的单个表达式进行求值。 有关在语句上下文中支持 switch 类语义的 switch 语句的信息,请参阅选择语句一文的 switch 语句部分。

下面的示例演示了一个 switch 表达式,该表达式将在线地图中表示视觉方向的 enum 中的值转换为相应的基本方位:

C#
public static class SwitchExample
{
    public enum Direction
    {
        Up,
        Down,
        Right,
        Left
    }

    public enum Orientation
    {
        North,
        South,
        East,
        West
    }

    public static Orientation ToOrientation(Direction direction) => direction switch
    {
        Direction.Up    => Orientation.North,
        Direction.Right => Orientation.East,
        Direction.Down  => Orientation.South,
        Direction.Left  => Orientation.West,
        _ => throw new ArgumentOutOfRangeException(nameof(direction), $"Not expected direction value: {direction}"),
    };

    public static void Main()
    {
        var direction = Direction.Right;
        Console.WriteLine($"Map view direction is {direction}");
        Console.WriteLine($"Cardinal orientation is {ToOrientation(direction)}");
        // Output:
        // Map view direction is Right
        // Cardinal orientation is East
    }
}

上述示例展示了 switch 表达式的基本元素:

  • 后跟 switch 关键字的表达式。 在上述示例中,这是 direction 方法参数。
  • switch expression arm,用逗号分隔。 每个 switch expression arm 都包含一个模式、一个可选的 case guard=> 标记和一个表达式 。

在上述示例中,switch 表达式使用以下模式:

  • 常数模式:用于处理 Direction 枚举的定义值。
  • 弃元模式:用于处理没有相应的 Direction 枚举成员的任何整数值(例如 (Direction)10)。 这会使 switch 表达式详尽

 重要

有关 switch 表达式支持的模式的信息及更多示例,请参阅模式

switch 表达式的结果是第一个 switch expression arm 的表达式的值,该 switch expression arm 的模式与范围表达式匹配,并且它的 case guard(如果存在)求值为 true。 switch expression arm 按文本顺序求值。

如果无法选择较低的 switch expression arm,编译器会发出错误,因为较高的 switch expression arm 匹配其所有值。

Case guard

模式或许表现力不够,无法指定用于计算 arm 的表达式的条件。 在这种情况下,可以使用 case guard。 case guard 是一个附加条件,必须与匹配模式同时满足。 case guard 必须是布尔表达式。 可以在模式后面的 when 关键字之后指定一个 case guard,如以下示例所示:

C#
public readonly struct Point
{
    public Point(int x, int y) => (X, Y) = (x, y);
    
    public int X { get; }
    public int Y { get; }
}

static Point Transform(Point point) => point switch
{
    { X: 0, Y: 0 }                    => new Point(0, 0),
    { X: var x, Y: var y } when x < y => new Point(x + y, y),
    { X: var x, Y: var y } when x > y => new Point(x - y, y),
    { X: var x, Y: var y }            => new Point(2 * x, 2 * y),
};

上述示例使用带有嵌套 var 模式属性模式

非详尽的 switch 表达式

如果 switch 表达式的模式均未捕获输入值,则运行时将引发异常。 在 .NET Core 3.0 及更高版本中,异常是 System.Runtime.CompilerServices.SwitchExpressionException。 在 .NET Framework 中,异常是 InvalidOperationException。 大大多数情况下,如果 switch 表达式未处理所有可能的输入值,则编译器会生成警告。 如果未处理所有可能的输入,列表模式不会生成警告。

 提示

为了保证 switch 表达式处理所有可能的输入值,请为 switch expression arm 提供弃元模式

C# 语言规范

有关详细信息,请参阅功能建议说明的 switch 表达式部分。

另请参阅

标签:Direction,Point,direction,switch,表达式,var,模式匹配
From: https://www.cnblogs.com/sexintercourse/p/18148326

相关文章

  • AutoCAD C# 在编程中使用字段表达式
    CAD中有些文字需要随着图纸的当前条件的变化自动变化,例如保存日期、打印日期、打印比例等等。CAD早期版本只是在扩展工具中提供了动态反应文字(rtext)功能,动态反应文字可以用CAD的Diesel表达式来定义动态文字,也可以动态链接文本文档,文本文档被编辑后,图纸中的文字会自动更新。由于......
  • 数据类型和表达式题目
    题目一求下列公式近似值题目二阿姆斯特朗数 也就是俗称的 水仙花数 ,是指一个三位数,其各位数字的立方和等于该数本身。例如:153=13+53+33,所以153就是一个 水仙花数 。求出1~1000之间所有的 水仙花数 。补充%d就是普通的输出了%2d是将数字按宽度为2,右对齐方式输出......
  • 数据库的关系代数表达式
    数据库的关系代数表达式关系代数是一种用于描述和操作关系数据库的形式化语言。它提供了一组基本操作,包括选择、投影、并、差、笛卡尔积等,可以用来表示和操作关系数据库中的数据。基本操作选择(Selection):从关系中选择满足指定条件的元组。投影(Projection):从关系中选择指定的属......
  • python 正则表达式匹配
    re模块: 案例:     python的贪婪和非贪婪 r的作用: ......
  • 在 VSCode 中使用正则表达式的示例
    下面是一些在VSCode中使用正则表达式的示例。在某个文件中查找相同的单词假设有一个名为sample.txt的文件,其内容如下:thequickbrownfoxjumpsoverthelazydog.thequickbrowncatjumpsoverthelazydog.thequickredhenjumpsoverthelazydog.我们想要查......
  • 栈4-后缀表达式
    栈4-后缀表达式中缀转后缀数字:直接输出左括号: 进栈运算符号:与栈顶符号进行优先级比较栈顶若是左括号,优先级最低栈顶符号优先级低: 此符号进栈栈顶符号优先级不低,弹出栈顶符号后进栈右括号:将栈顶符号弹出并输出,知道匹配到左括号遍历结束:弹出并输出所......
  • 栈5-后缀表达式求解
    栈5-后缀表达式的求解求解过程831-5*+数字:进栈[1,3,8]符号:-从栈中弹出右操作数-1从栈中弹出左操作数3-1根据符号进行运算2将运算结果压入栈中[2,8]遍历结束,栈中唯一的数字作为计算结果定义栈结构typedefstructMYNUM{LinkNodenode;int......
  • 正则表达式
    1.regexp命令 regexp匹配正则表达式与字符串,它的语法为: regexp?switches?expstring?matchvar??subMatchVar...subMatchVar? regexp命令比较字符串string是否与正则表达式exp部分或者全部匹配,并可以将字符串中的子字符串提取出来。如果字符串的某个子字符......
  • Effective Python:第5条 用辅助函数取代复杂的表达式
    初始代码: 第一次优化:多次使用:  ......
  • 正则表达式
    Python正则表达式Python正则表达式是一种用来匹配和处理字符串的强大工具。Python提供了re模块来支持正则表达式的使用。re模块常用函数re.compile(pattern,flags=0):根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配......