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
https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-9
https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp9Sample
https://github.com/WeihanLi/SamplesInPractice/blob/master/CSharp9Sample/PatternMatchingSample.cs
到此這篇關(guān)于C#9新特性之增強的模式匹配的文章就介紹到這了,更多相關(guān)C#9 模式匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
WPF調(diào)用WindowsAPI實現(xiàn)屏幕錄制
這篇文章主要為大家詳細介紹了WPF如何調(diào)用WindowsAPI實現(xiàn)屏幕錄制,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下2023-05-05
winfrom 在業(yè)務(wù)層實現(xiàn)事務(wù)控制的小例子
winfrom 在業(yè)務(wù)層實現(xiàn)事務(wù)控制的小例子,需要的朋友可以參考一下2013-03-03
C#將布爾類型轉(zhuǎn)換成字節(jié)數(shù)組的方法
這篇文章主要介紹了C#將布爾類型轉(zhuǎn)換成字節(jié)數(shù)組的方法,涉及C#中字符串函數(shù)的使用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04
C#中的Task.WaitAll和Task.WaitAny方法介紹
這篇文章介紹了C#中的Task.WaitAll和Task.WaitAny方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
WPF自定義TreeView控件樣式實現(xiàn)QQ聯(lián)系人列表效果
TreeView控件在項目中使用比較頻繁,下面這篇文章主要給大家介紹了關(guān)于WPF自定義TreeView控件樣式實現(xiàn)QQ聯(lián)系人列表效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2018-04-04
C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序
這篇文章介紹了C#構(gòu)造函數(shù)在基類和父類中的執(zhí)行順序,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04
C#類型轉(zhuǎn)換之顯式和隱式轉(zhuǎn)換詳解
在C#編程中,類型轉(zhuǎn)換是一個核心概念,它允許我們在程序中處理不同類型的數(shù)據(jù),類型轉(zhuǎn)換可以分為兩大類:顯式類型轉(zhuǎn)換和隱式類型轉(zhuǎn)換,在這篇博客中,我們將深入探討這兩種類型轉(zhuǎn)換的定義、用法和重要性,需要的朋友可以參考下2024-07-07

