C# 9 新特性 —— 增强的模式匹配

  • A+
所属分类:.NET技术
摘要

C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧


C# 9 新特性 —— 增强的模式匹配

Intro

C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧

Sample

C# 9 中增强了模式匹配的用法,增加了 and/or/not 操作符,而且可以直接判断属性,来看一下下面的这个示例:

var person = new Person();  // or // string.IsNullOrEmpty(person.Description) if (person.Description is null or { Length: 0 }) {     Console.WriteLine($"{nameof(person.Description)} is IsNullOrEmpty"); }  // and // !string.IsNullOrEmpty(person.Name) if (person.Name is not null and { Length: > 0 }) {     if (person.Name[0] is (>= 'a' and <= 'z') or (>= 'A' and <= 'Z') or '.')     {     } }  // not if (person.Name is not null) { } 

这里的代码使用 DnSpy 反编译之后的代码是下面这样的:

Person person = new Person(); string text = person.Description; bool flag = text == null || text.Length == 0; if (flag) {     Console.WriteLine("Description is IsNullOrEmpty"); } text = person.Name; bool flag2 = text != null && text.Length > 0; if (flag2) {     char c = person.Name[0];     if (c >= 'a')     {         if (c > 'z')         {             goto IL_8B;         }     }     else if (c >= 'A')     {         if (c > 'Z')         {             goto IL_8B;         }     }     else if (c != ',' && c != '.')     {         goto IL_8B;     }     bool flag3 = true;     goto IL_8E;     IL_8B:     flag3 = false;     IL_8E:     bool flag4 = flag3;     if (flag4)     {     } } bool flag5 = person.Name != null; if (flag5) { } 

Switch

这不仅适用于 is 也可以在 switch 中使用

switch (person.Age) {     case >= 0 and <= 3:         Console.WriteLine("baby");         break;      case > 3 and < 14:         Console.WriteLine("child");         break;      case > 14 and < 22:         Console.WriteLine("youth");         break;      case > 22 and < 60:         Console.WriteLine("Adult");         break;      case >= 60 and <= 500:         Console.WriteLine("Old man");         break;      case > 500:         Console.WriteLine("monster");         break; } 

反编译后的代码:

int age = person.Age; int num = age; if (num < 22) {     if (num < 14)     {         if (num >= 0)         {             if (num > 3)             {                 Console.WriteLine("child");             }             else             {                 Console.WriteLine("baby");             }         }     }     else if (num > 14)     {         Console.WriteLine("youth");     } } else if (num < 60) {     if (num > 22)     {         Console.WriteLine("Adult");     } } else if (num > 500) {     Console.WriteLine("monster"); } else {     Console.WriteLine("Old man"); } 

More

可以看到有些情况下可以简化不少代码,尤其是 if 分支比较多的情况下使用上面 switch 这样的写法会清晰很多

但是如果只是 string.IsNullOrEmpty 这种代码最好还是不要写得这么骚了,小心要被同事吐槽了

炫技需谨慎,小心被 ...

Reference