C# 在 7,8,9 陸續加了很多 Pattern Matching 的東西,讓你的程式碼能夠再簡潔與彈性化一點(其實是我沒更新技術、有些語法糖看不懂,於是就有了這篇)。Pattern 數量不少,但看過幾次就會使用了,是很簡單易學的語言呢!!(招生)
Logic pattern
以前我們都是直接使用 ==
1 2 3 4 5 6 7 8 9 10 11
|
if (sample == null) { Console.WriteLine("Sample is null"); } else { Console.WriteLine("Sample is NOT null"); }
|
新版的可以直接使用 is
以及 is not
1 2 3
| if (sample is null)
if (sample is not null)
|
Parenthesized pattern
其實算是上面的延伸,就看商務需求各自發揮了
1
| if (sample is (int or string))
|
Relation Pattern
以前的 switch 語法是這樣寫的
1 2 3 4 5 6 7 8 9 10 11
| static string OldSchool(int parameter) { var val = string.Empty; switch (parameter) { case 1 : val = "First"; break; case 2 : val = "Second"; break; default : val = "Others"; break; } return val; }
|
現在能一再演化成更精簡的模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| static string SugarSyntax(int parameter) { return parameter switch { 1 => "First", 2 => "Second", _ => "Others" }; }
static string SugarSyntax2(int parameter) => parameter switch { 1 => "First", 2 => "Second", _ => "Others" };
|
加入其他比較的運算元也可以!
1 2 3 4 5 6 7
| static string SugarSyntax3(int parameter) => parameter switch { >100 => "At least > 100", >0 and <50 => ">0 and <50", <0 => "Negative", _ => "Others" };
|
Property Pattern
這個算是我認為幫助更大的,省略了更多多餘的程式碼。
假設我們有個類別,要判斷它的值是否為我們期望的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class SampleClass { public int IntProperty { get; set; }
public string StringProperty { get; set; } }
var sample = new SampleClass { IntProperty = 3, StringProperty = "Cool" };
if (sample != null) { if (sample.IntProperty == 3 && sample.StringProperty == "Cool") { Console.WriteLine("You are my sample!"); } }
|
在新版語法中,我們只需要一行即可,甚至省略了很多內容。第一次看到當下,還以為是別的語法呢XD
1 2 3 4 5 6 7
| if (sample is { IntProperty: 3, StringProperty: "Cool" }) { Console.WriteLine("You are my sample!"); }
static bool IsMySample(SampleClass obj) => obj is { IntProperty: 3, StringProperty: "Cool" };
|
覺得差不多介紹到這就好,因為剩下來的我認為也都是差不多,或者擴充的內容。如果感興趣可以自己參考下方的連結。
Reference