又有一種源自於函式式程式語言中的概念加入了c#和vb的陣營,這就是被稱為模式匹配(pattern matching)的特性。初看上去,模式匹配的作用類似於一段switch/select語句塊,但它的功能要強大的多。
請注意:由於vb版本的規格說明現在還沒有完成,因此這些示例主要都是來自於c#中的模式匹配規格說明。
.net中的模式匹配主要是通過「is/matches」操作符支援的。這種還讓人不太熟悉的操作符將乙個類分解為多個組成部分。以下這個示例是基於在周二的新聞報道中所提到過的cartesian記錄類 class)的基礎上建立的。
1
2
3
4
5
public
static
bool
operator
is
(cartesian c,
out
double
x,
out
double
y)
x = c.x;
y = c.y;
return
true
;
}
這個is操作符不僅限於在它的定義類中使用,以下這個示例以另一種方式定義了乙個操作符,使它能夠分解乙個cartesian物件,讓它能夠匹配乙個polar物件。
1
2
3
4
5
6
7
8
9
10
11
public
static
class
polar
}
var c = cartesian(3, 4);
if
(c
is
polar(var r, *))
console.writeline(r);
最簡單的模式是型別模式,它本質上就是嘗試進行型別轉換並同時賦給某個變數。以下是這種模式的乙個示例:
1
2
if
(expr
is
type v)
多數模式都是作為遞迴模式的形式出現,意即它們是由較簡單的模式所組成的。看一下這種模式的示例:
1
2
var a =
new
location(1, 2, 3);
//x=1, y=2, z=3
if
(a
is
location(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
case
null
:
case
string s
case
location(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...