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

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


版权声明:本文为qq_40044912原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。