C 6與VB 12即將加入模式匹配

2021-09-08 10:25:10 字數 2670 閱讀 8170

又有一種源自於函式式程式語言中的概念加入了c#和vb的陣營,這就是被稱為模式匹配(pattern matching)的特性。初看上去,模式匹配的作用類似於一段switch/select語句塊,但它的功能要強大的多。

請注意:由於vb版本的規格說明現在還沒有完成,因此這些示例主要都是來自於c#中的模式匹配規格說明。

.net中的模式匹配主要是通過「is/matches」操作符支援的。這種還讓人不太熟悉的操作符將乙個類分解為多個組成部分。以下這個示例是基於在周二的新聞報道中所提到過的cartesian記錄類 class)的基礎上建立的。

1

2

3

4

5

publicstaticbooloperatoris(cartesian c,outdoublex,outdoubley)

x = c.x;

y = c.y;

returntrue;

}

這個is操作符不僅限於在它的定義類中使用,以下這個示例以另一種方式定義了乙個操作符,使它能夠分解乙個cartesian物件,讓它能夠匹配乙個polar物件。

1

2

3

4

5

6

7

8

9

10

11

publicstaticclasspolar

}

var c = cartesian(3, 4);

if(cispolar(var r, *))

console.writeline(r);

最簡單的模式是型別模式,它本質上就是嘗試進行型別轉換並同時賦給某個變數。以下是這種模式的乙個示例:

1

2

if(expristype v)

多數模式都是作為遞迴模式的形式出現,意即它們是由較簡單的模式所組成的。看一下這種模式的示例:

1

2

var a =newlocation(1, 2, 3);//x=1, y=2, z=3

if(aislocation(1, var y, *))

這個遞迴模式包括了乙個常數模式,乙個var模式和乙個萬用字元模式。

這個模式可以將乙個屬性與乙個常數值進行匹配,常數匹配使用object.equals(left, right)方法來判斷兩者是否匹配。

var模式是一定會匹配成功的,該模式對應的變數將會被賦值為呼叫該is操作符時所提供的值,而該變數的型別則是由該表示式所決定的靜態型別。

萬用字元模式本質上來說就是var表示式,不過你不需要關心匹配的結果。

讓我們繼續討論一下這個location類的示例,編譯器在編譯階段會進行以下幾個步驟的處理:

建立變數$x、$y和$z

呼叫location.is(a, out $x, out $y, out $z)方法,並確認返回結果為true

常數模式:檢查object.equals($x, 1)呼叫的結果

var模式:將$y賦給y

萬用字元模式:忽略$z變數

switch語句塊的功能將得到擴充套件,它將能夠使用模式匹配特性。這實際上意味著你可以按以下方式編寫語句:

1

2

3

casenull:

casestring s

caselocation(1, var y, *):

在目前的規格草稿中,還沒有對於範圍檢查的支援。這意味著你不能編寫類似於「a is location( > 0, 1 to 5, <= 10)」這樣的**。此外目前也不支援在乙個列表或迭代器中進行元素匹配。

英文原文:pattern matching in c# 6 and vb 12

C 6與VB 12即將加入模式匹配

又有一種源自於函式式程式語言中的概念加入了c 和vb的陣營,這就是被稱為模式匹配 pattern matching 的特性。初看上去,模式匹配的作用類似於一段switch select語句塊,但它的功能要強大的多。u0026 xd n u0026 xd n 請注意 由於vb版本的規格說明現在還沒有完...

C 6和 VB 12的最新特性列表

隨著下個版本的c 發布日逐漸臨近,那些還沒有完成的特性必須被砍掉。最近從特性列表中被砍掉的特性包括主要建構函式 primary constructor 和宣告表示式 declaration expression mads torgersen寫道 u0026 xd n u0026 xd n u0026...

C6 定向越野

為了鍛鍊身體,某楠參加了乙個定向越野比賽,定向越野是利用地圖和指北針導航的一項競技運動,通常由起點出發,在多個點標處打卡,再返回終點。但是非酋某楠的指北針居然是壞的,所以只能靠記住來時的方向和各個點的座標來判斷下一步。現在希望你能夠幫忙判斷下一步是左轉還是右轉。對於每次轉彎輸出乙個字元,左轉輸出 l...