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

2021-09-16 18:10:23 字數 2629 閱讀 4997

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

\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\npublic static bool operator is(cartesian c, out double x, out double y)\u0026#xd;\n    x = c.x;\u0026#xd;\n    y = c.y;\u0026#xd;\n    return true;\u0026#xd;\n}
\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\npublic static class polar \u0026#xd;\n}\u0026#xd;\nvar c = cartesian(3, 4);\u0026#xd;\nif (c is polar(var r, *))\u0026#xd;\n   console.writeline(r);
\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\nif (expr is type v)\u0026#xd;\n
\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\nvar a = new location(1, 2, 3); //x=1, y=2, z=3\u0026#xd;\nif (a is location(1, var y, *))
\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

建立變數$x、$y和$z\u0026#xd;\n\t

呼叫location.is(a, out $x, out $y, out $z)方法,並確認返回結果為true\u0026#xd;\n\t

常數模式:檢查object.equals($x, 1)呼叫的結果\u0026#xd;\n\t

var模式:將$y賦給y\u0026#xd;\n\t

萬用字元模式:忽略$z變數\u0026#xd;\n

\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

\u0026#xd;\ncase null:\u0026#xd;\ncase string s\u0026#xd;\ncase location(1, var y, *):
\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n\u0026#xd;\n

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

\u0026#xd;\n\u0026#xd;\n

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

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

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

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

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

C6 定向越野

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