您的位置:首頁>手機>正文

C#7.0新特性和語法糖詳解

感謝IT之家網友

DotNet碼農

的投稿

伴隨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加入的新特性和語法糖可以非常有效地提升我們程式設計的效率,也更有利於降低錯誤率。瞭解它們,對以後的工作將帶來極大的幫助。

喜欢就按个赞吧!!!
点击关闭提示