vs2017也rc好幾個版本了,本想跟進看看c#7加入了什麼內容,去搜尋c#7,確實找到了不少文章,無奈很多特性ide根本不讓編譯啊。。。所以今天主要列出已經確定了的c#7特性(一般來說rc後也不會加入新的特性了,其它的預覽特性我們可能等c#8哈哈)
out變數
在c#7之前我們得這樣
在c#7中我們可以這樣
當然你還可以使用“var”
這算一個小更新,其實這個問題存在很久了,應該也很好解決,不知為何到c#7才開始引入,不管如何以後可以少些一行程式碼了。
元組(Tuples)
需要安裝nuget包:System.ValueTuple
個人覺得這是c#7中帶來最cool也是最有用的變化了,我們從頭來看。
大家還記得“Tuple”嗎?不記得?ok我們看看它的定義。
在來看看使用
想不想哭。。講真,自我程式設計以來幾乎沒有用過Tuple,“ItemN”對開發者非常的不友好,我寧願建立一個struct或class來定義屬性器。
我們在c#7中試試(這也算多返回值了)?
如果你覺得return (1,xxx)不夠準確,那麼你可以
如果你不想result.xxx,那麼你還可以“解構”
你還可以這樣(不推薦)
還可以在方法內臨時建立一個元組
通過這些特性我們還可以連續宣告並賦值變數了
解構類(不推薦)
模式匹配(Pattern matching)
這一塊主要是對“switch”進行了豐富,有點類似c#6的異常過濾器
在之前的版本中switch只能case常量,而現在可以擁有更多的條件了
在c#7中我們可以這樣
本地引用和返回(Ref locals and returns)
這個個人比較少用,簡單寫個對比程式碼
本地函式(Local functions)
這個是個很實用的功能,算是action、和func的豐富,我們來看一個例子:
遞迴呼叫在c#7之前
在c#7中
表示式可用於更多成員(More expression-bodied members)
表示式丟擲異常(Throw expressions)
值型別的非同步返回(Generalized async return types)
需要安裝nuget包:System.Threading.Tasks.Extensions
嚴格意義上這個不算一個語法的新特性而是增加了一些類。
在之前我們想用“async”、“await”就必須使用Task作為返回值(void特殊情況忽略),但Task是一個引用型別(class),這樣在非常簡單的任務中會造成浪費(記憶體和gc)
在c#7中微軟新增了一個nuget包,增加了一個新的型別“ValueTask”用來解決這個問題。它是值型別的。
數值語法改進(Numeric literal syntax improvements)
媽媽再也不怕我多加個0啦~
寫在最後
寫這個的時候還是蠻頭疼的,因為一下子想不起來這個特性的適用場景,還是需要具體實踐之後才能體會新的語法是否有用。
值得注意的是一些新的語法既然跟nuget包扯上了關係,這個我們下次再看細看,主要是roslyn的功勞。
參考資料:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/csharp-7