C# switch的全新版本

C#8.0 switch新用法

在公司发现了类似return(String)switch{
AName => new User(Repository, settings),
BName => new User2(Repository, settings),
_ => throw new ArgumentException(…),}这种用法,
以作记录

模式和 case guard

switch expression arm 支持许多模式。 前面的示例使用了值模式 。 值模式 将范围表达式与一个值进行比较。 该值必须是编译时常量。 类型模式 将范围表达式与已知类型进行比较。 下面的示例从序列中检索第三个元素。 它使用基于序列类型的不同方法:

public static T TypeExample<T>(IEnumerable<T> sequence) =>
    sequence switch
    {
        System.Array array => (T)array.GetValue(2),
        IList<T> list      => list[2],
        IEnumerable<T> seq => seq.Skip(2).First(),
    };

模式可以是递归模式,其中模式会测试一个类型,如果该类型匹配,则该模式将匹配范围表达式上的一个或多个属性值。 可以使用递归模式来扩展前面的示例。 为包含少于 3 个元素的数组添加 switch expression arm。 下面的示例演示了递归模式:

public static T ExhaustiveExample<T>(IEnumerable<T> sequence) =>
    sequence switch
    {
        System.Array { Length : 0}       => default(T),
        System.Array { Length : 1} array => (T)array.GetValue(0),
        System.Array { Length : 2} array => (T)array.GetValue(1),
        System.Array array               => (T)array.GetValue(2),
        IEnumerable<T> list
            when !list.Any()             => default(T),
        IEnumerable<T> list
            when list.Count() < 3        => list.Last(),
        IList<T> list                    => list[2],
        null                             => throw new ArgumentNullException(nameof(sequence)),
        _                                => sequence.Skip(2).First(),
    };

前面的示例添加了 null 模式,并将 IEnumerable 类型模式更改为 _ 模式。 null 模式提供 null 检查作为 switch expression arm。 该 arm 的表达式引发 ArgumentNullException。 _ 模式与先前的 arm 未匹配的所有输入相匹配。 它必须在 null 检查之后执行,否则将与 null 输入匹配。

具体文档可以看官方文档.

### C#Switch 语句的用法 C# 的 `switch` 语句是一种多分支选择结构,用于根据变量的不同值执行不同的代码块。它提供了一种简洁的方式来替代多个 `if...else if...else` 结构。 #### 基本语法 以下是 C# 中 `switch` 语句的基本形式: ```csharp switch (expression) { case value1: // 当 expression 等于 value1 时执行的代码 break; case value2: // 当 expression 等于 value2 时执行的代码 break; default: // 默认情况下执行的代码 break; } ``` - **expression**: 被测试的表达式。 - **valueN**: 表达式的可能匹配值。 - **break**: 防止程序继续进入下一个 `case` 或 `default` 分支。 - **default**: 可选部分,在没有任何 `case` 匹配时执行。 #### 示例:传统方式下的 `switch` 使用 下面是一个简单的例子,展示如何使用传统的 `switch` 语句[^3]: ```csharp int number = 2; switch (number) { case 1: Console.WriteLine("Number is one."); break; case 2: Console.WriteLine("Number is two."); // 输出此行 break; default: Console.WriteLine("Unknown number."); break; } ``` #### 特性:模式匹配与守卫条件 自 C# 7.0 开始引入了更强大的功能——**模式匹配**和**守卫条件**,这使得 `switch` 更加灵活。可以像 Python 中那样定义复杂的逻辑判断[^4]。 ##### 守卫条件的例子 通过添加额外的布尔表达式作为过滤器(即守卫),可以在特定条件下触发某个分支: ```csharp object obj = "hello"; switch (obj) { case int i when i > 0: Console.WriteLine($"Positive integer {i}"); break; case string s when s.Length > 5: Console.WriteLine($"{s} has more than five characters"); break; default: Console.WriteLine("Default branch executed."); break; } ``` 上述代码展示了当对象为字符串且长度大于五字符时会打印相应的消息;如果它是正整数则显示数值信息[^4]。 #### 关联到其他语言的行为调整 值得注意的是,虽然某些操作符如 `<`, `>` 在不同版本的标准下评估顺序有所变化[^1],但在实际应用中这些细节通常不会直接影响到日常开发中的控制流设计比如 `switch-case` 构造上。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我也秃了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值