C 7 0新特性和語法糖詳解

2022-02-18 05:52:50 字數 2505 閱讀 4577

伴隨visual studio 2017的發布,c#7.0開始正式走上工作崗位。對於早已熟悉了舊版本c#的開發者來說,c#7.0增加的不少新特性和語法糖能在很大程度上提公升程式設計效率並降低出錯率。本文將闡述c#7.0給出的9個改進。

1、元組——更優雅地返回多個值

之所以將元組放在第一位,是因為它對c#程式設計體驗的提公升實在是太大了。元組這個概念在以前就已經被引入了c#,只不過它是通過乙個名為tuples的泛型類來實現的。使用這個泛型類雖然可以達到類似元組的效果,但是可讀性實在是太差了,完全就沒有辦法通過**理解函式返回的到底是什麼,本應該是人類友好的引數名不得不變成item1、item2這樣的抽象名稱。也正是因為如此,一般的開發者更傾向於自己定義乙個結構來用於返回多個值。

c#7.0引入的元組語法能讓你更優雅地完成這一任務。你可以通過這種方式來表示乙個函式的返回值型別:

在外部**裡,你可以這樣來訪問這個元組型別包含的多個值:

這可比先前c#版本裡,用item1、item2、item3來表示元組元素的方法直觀多了,你也不必寫著寫著就要回去檢視自己的函式返回的順序是怎樣的了。

當然,如果你不想用型別推斷和匿名元組型別的話,你還能這樣解構乙個元組:

使用元組的前提,是你引用了來自微軟官方的system.valuetuple包:

2、區域性函式——函式作用域新玩法

鑑於元組可能會炸腦,所以現在來點輕鬆的——區域性函式,這是比較容易理解的乙個新特性。簡而言之,現在可以在函式裡定義函式了,而且通常這個函式裡的函式只能在外層函式裡訪問。直接上例子:

3、引用傳遞和引用返回——不必擔心值型別的引用傳遞

熟悉c#的朋友肯定知道,如果運算元是值型別,那麼賦值運算子(等號)預設傳遞是這個型別的值;但是某些時候,我們不希望c#「自作聰明」地給我們傳遞值,而希望傳遞這個值型別的引用。在c#7.0中,微軟重新利用了使用率不高的關鍵字ref,來表明我們要傳遞的是乙個引用而不是值。下面是例項:

這段程式的輸出結果是3,而不是通常認為的0。原因是中間的那句賦值,我們告訴c#,我們要傳遞的是引用,而不是值。所以後來對b的值作出修改,a的值同步改變了。

類似的,我們可以用相同的方式來讓乙個函式返回乙個值型別的引用而不是它的值:

4、模式——比較和匹配的新玩法

作為一門基於型別的語言,「封箱」和「拆箱」操作肯定深入人心。拆箱之前,我們經常需要判斷這個箱子到底是什麼型別的(is運算子)。以前版本的c#有個模板式的寫法是:先用is運算子判斷封箱型別,然後用as運算子拆箱。現在這個模板式的語法可以被縮寫成這樣了:

不僅如此,c#7.0把這種東西稱作「模式匹配」,這讓你能用switch/case語句來批量判斷封箱型別,並用when關鍵字來限定拆箱結果的條件。比如:

5、語法糖——out變數直接定義

以前在使用帶有out引數的函式的時候,我們必須先把要賦值的out引數定義好,在傳遞給函式。現在可以直接在傳遞的時候定義out引數了:

6、通用非同步返回型別

通常來說,非同步方法返回型別必須是void,task或者task,這種方式的明顯缺點,就是會在等待時但非同步結果已經可用的情況下,對task進行分配。c#7.0加入了valuetask泛型型別,用來解決上述問題,這能顯著提公升部分非同步程式的效能。簡而言之,valuetask會建立乙個cache,用來快取已經可用的值,而不至於每一次都等待乙個相同的非同步方法執行完全相同的步驟。舉例子的話篇幅會比較長,所以煩請大家自己查閱msdn。

7、語法糖——λ表示式現在支援了更多的函式

在c#7.0中,建構函式、析構函式和屬性訪問器也可以使用λ表示式了,比如:

8、語法糖——異常表示式

新增的運算子??(兩個半形問號)用於在引用為null的時候丟擲異常:

9、語法糖——數字裡可以新增下劃線增強可讀性

現在c#7.0認為,1234_5678和12345678是乙個數字了。也就是,數字中的下劃線會被忽略。

總結:c#7.0加入的新特性和語法糖可以非常有效地提公升我們程式設計的效率,也更有利於降低錯誤率。了解它們,對以後的工作將帶來極大的幫助。

C 7 0 新特性4 返回引用

本文參考roslyn專案中的issue 118。1.c 7.0 新特性1 基於tuple的 多 返回值方法 2.c 7.0 新特性2 本地方法 3.c 7.0 新特性3 模式匹配 4.c 7.0 新特性4 返回引用 c 早在最初的發行版c 1.0中 2002年1月 就借鑑並延續了c c 中指標引數,...

C 7 0 特性例項

using system using system.collections.generic using system.linq using system.text using system.threading.tasks namespace csharp 7.0 a,b function ref r...

C 6 0和7 0的部分新特性介紹

語言版本 發布時間 net framework要求 c 1.0 2002.1 net framework 1.0 c 1.1 1.2 2003.4 net framework 1.1 c 2.0 2005.11 net framework 2.0 c 3.0 2007.11 net framewor...