C# 9 中进一步增强了模式匹配的用法,使得模式匹配更为强大,我们一起来了解一下吧
C# 9 中增强了模式匹配的用法,增加了 and/or/not 操作符,而且可以直接判断属性,来看一下下面的这个示例:
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 '.') { }}// notif (person.Name is not null){}
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 反编译之后的代码是下面这样的:
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){}
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')
else if (c != ',' && c != '.')
bool flag3 = true;
goto IL_8E;
IL_8B:
flag3 = false;
IL_8E:
bool flag4 = flag3;
if (flag4)
bool flag5 = person.Name != null;
if (flag5)
这不仅适用于 is 也可以在 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;}
switch (person.Age)
case >= 0 and <= 3:
Console.WriteLine("baby");
break;
case > 3 and < 14:
Console.WriteLine("child");
case > 14 and < 22:
Console.WriteLine("youth");
case > 22 and < 60:
Console.WriteLine("Adult");
case >= 60 and <= 500:
Console.WriteLine("Old man");
case > 500:
Console.WriteLine("monster");
反编译后的代码:
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");}
int age = person.Age;
int num = age;
if (num < 22)
if (num < 14)
if (num >= 0)
if (num > 3)
else
else if (num > 14)
else if (num < 60)
if (num > 22)
else if (num > 500)
可以看到有些情况下可以简化不少代码,尤其是 if 分支比较多的情况下使用上面 switch 这样的写法会清晰很多
if
但是如果只是 string.IsNullOrEmpty 这种代码最好还是不要写得这么骚了,小心要被同事吐槽了
string.IsNullOrEmpty
炫技需谨慎,小心被 ...
原文链接:http://www.cnblogs.com/weihanli/p/14226240.html
本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728