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 输入匹配。

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

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值