C# 的 模式比對 (Pattern Matching)

C# 在 7,8,9 陸續加了很多 Pattern Matching 的東西,讓你的程式碼能夠再簡潔與彈性化一點(其實是我沒更新技術、有些語法糖看不懂,於是就有了這篇)。Pattern 數量不少,但看過幾次就會使用了,是很簡單易學的語言呢!!(招生)


Logic pattern

  • 判斷是否為 null。

以前我們都是直接使用 ==

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" };

// 首先我們要判斷他是否為 null
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!");
}

// 或者改成 method
static bool IsMySample(SampleClass obj) => obj is { IntProperty: 3, StringProperty: "Cool" };

覺得差不多介紹到這就好,因為剩下來的我認為也都是差不多,或者擴充的內容。如果感興趣可以自己參考下方的連結。


Reference

  • 作者: MingYi Chou
  • 版權聲明: 轉載不用問,但請註明出處!本網誌均採用 BY-NC-SA 許可協議。