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 输入匹配。
具体文档可以看官方文档.