C#最新功能(6.0、7.0)

一直用C#開發程序,.NET的功能越來越多,變化也挺大的,從最初的封閉,到現在的開源,功能不斷的增加,一直在進步。作為C#的強烈支持者,C#的變化,我不能不關注,這篇文章主要介紹,C#6.0和C#7.0增加的功能。C#的發展史和.NET以前的版本,請看C#和.NET版本,這邊文章中有介紹。

C# 6.0版

1. 靜態導入

using static 增強功能可用于導入單個類的靜態方法。

例如:using static System.String;可以直接用String類中的靜態方法,而不用string.XXXX

2. 異常篩選器

“異常篩選器”是確定何時執行catch中的程序, 如果用于異常篩選器的表達式計算結果為 true,則 catch 子句將對異常執行正常處理,如果表達式計算結果為 false,則將跳過 catch 子句。

例如:e.Message.Contains("test")為true執行,否則不執行

try{thrownewException("test");}catch(Exceptione) when (e.Message.Contains("test")) {? ? Console.WriteLine("ce");}

3. 只讀自動屬性、自動屬性初始化表達式、Expression bodied 成員、字符串內插

可以讓屬性初始化,僅僅初始化一次,這適用于方法和只讀屬性

例如:

publicclassClass6{publicstringLastName {get;set; }publicstringFirstName {get;set; }publicstringFullName =>$"{FirstName}{LastName}";publicoverridestringToString()=>$"{FirstName},{LastName}";}//調用Class6 test =newClass6();test.LastName ="jie";test.FirstName ="hua";Console.WriteLine($"FullName:{test.FullName}, ToString:{test.ToString()}");test.LastName ="xiao jie";Console.WriteLine($"FullName:{test.FullName}, ToString:{test.ToString()}");//運行結果//FullName:hua jie, ToString:hua,jie//FullName:hua xiao jie, ToString:hua,xiao jie

4. Null 傳播器

Null 條件運算符使 null 檢查更輕松、更流暢。 將成員訪問 . 替換為 ?.

例如:var first = person?.FirstName; string test = null;string t = test?.ToString();

如果 Person 對象是 null,則將變量 first 賦值為 null,否則,將 FirstName 屬性的值分配給該變量。【?.】的左側使用任何表達式(包括方法調用)

5. nameof 運算符

nameof 表達式的計算結果為符號的名稱,簡單來說就是為了顯示名稱。

例如: string test = "測試"; Console.WriteLine($"{test} , nameof:{nameof(test)}");

結果:測試 , nameof:test

6. 索引初始值設定項

索引初始值設定項就是對索引初始化,可以像Cat cat = new Cat { Age = 10, Name = "Fluffy" };初始化值一樣,只不過現在增加了索引的初始化

7. Catch 和 Finally 塊中的 Await

C# 5 對于可放置 await 表達式的位置有若干限制。 使用 C# 6,現在可以在 catch 或 finally 表達式中使用 await。

例如:

try{thrownewException("test");}catch(Exception e)when(e.Message.Contains("test")){? ? await Task.Run(()=>{ Console.WriteLine($"await catch"); });}finally{? ? await Task.Run(()=>{ Console.WriteLine($"await finally"); });}

C#7.0

1. Out 變量

現在可以在方法調用的參數列表中聲明 out 變量,而不是編寫單獨的聲明語句

例如:

if(int.TryParse("123", outintresult))? ? Console.WriteLine(result)

2. 元組

需要包含多個數據元素的簡單結構的方法,也不知道怎么解釋,總之就是好用。

例如:

(stringName,intAge) user = ("小紅",18);Console.WriteLine($"Name:{user.Name}, Age:{user.Age}");

ValueTuple valueTuple =newValueTuple("小紅",18);//可以和Tuple對比學習Tuple test =newTuple("小紅",18);//ValueTuple是值類型,Tuple是引用類型

3. 模式匹配

模式匹配 是一種可讓你對除對象類型以外的屬性實現方法分派的功能,模式匹配支持 is 表達式和 switch 表達式。每個表達式都允許檢查對象及其屬性以確定該對象是否滿足所尋求的模式,使用 when 關鍵字來指定模式的其他規則。is 表達式的增強功能, 可以針對值類型和引用類型進行測試。簡單來說就是幫你測試類型。

例如:

string test ="123";if(test isintcount) Console.WriteLine(count);

上面的例子會提示int類型的模式無法處理string類型的表達式。

4. 本地函數

許多類的設計都包括僅從一個位置調用的方法。 這些額外的私有方法使每個方法保持小且集中。 本地函數使你能夠在另一個方法的上下文內聲明方法 。 本地函數使得類的閱讀者更容易看到本地方法僅從聲明它的上下文中調用。簡單來說就是方法中寫方法。

例如:

publicstaticintTest(){intcount = Add(12,10);returncount;intAdd(inta,intb){returna + b;? ? }}

5. Ref 局部變量和返回結果

此功能允許使用并返回對變量的引用的算法,這些變量在其他位置定義。

例如:

classNumberStore{int[] numbers = {1,3,7,15,31,63,127,255,511,1023};publicrefintFindNumber(inttarget){for(intctr =0; ctr < numbers.Length; ctr++)? ? ? ? {if(numbers[ctr] >= target)returnrefnumbers[ctr];? ? ? ? }returnrefnumbers[0];? ? }publicoverridestringToString()=>string.Join(" ", numbers);}varstore =newNumberStore();Console.WriteLine($"Original sequence:{store.ToString()}");intnumber =16;refvarvalue=refstore.FindNumber(number);value*=2;Console.WriteLine($"New sequence:{store.ToString()}");// The example displays the following output://? ? ? Original sequence: 1 3 7 15 31 63 127 255 511 1023//? ? ? New sequence:? ? ? 1 3 7 15 62 63 127 255 511 1023

31變成62了,對象中的數組值改變了,這個功能覺得要慎用。

6. 棄元

通常,在進行元組解構或使用 out 參數調用方法時,必須定義一個其值無關緊要且你不打算使用的變量。 為處理此情況,C# 增添了對棄元的支持 。 棄元是一個名為 _(下劃線字符)的只寫變量,可向單個變量賦予要放棄的所有值。 棄元類似于未賦值的變量;不可在代碼中使用棄元(賦值語句除外)。簡單來說就是放棄不需要的值。

例如:

privatestatic(string,double,int)Test(stringname){return(name,1.234,20);}//使用var(name, _, age) = Test("測試");Console.WriteLine($"測試棄元: Name:{name}, Age:{age}");//運行結果:測試棄元: Name:測試, Age:20

7. 二進制文本和數字分隔符

誤讀的數值常量可能使第一次閱讀代碼時更難理解。 位掩碼或其他符號值容易產生誤解。 C# 7.0 包括兩項新功能,可用于以最可讀的方式寫入數字來用于預期用途:二進制文本和數字分隔符 。簡單來說就是可以把數字分割等

例如:

inttest =1_123_21;Console.WriteLine(test);//結果 112321

8. 引發表達式

throw 始終是一個語句。 因為 throw 是一個語句而非表達式,所以在某些 C# 構造中無法使用它。

例如:string test = false ? "" : throw new Exception("必須是字符串,否則報錯。");

9. 增加異步返回類型ValueTask

異步方法返回類型不限于 Task、Task<T> 和 void,可以是ValueTask<int>,可避免在性能上分配 Task。

看我主頁簡介免費C++學習資源,視頻教程、職業規劃、面試詳解、學習路線、開發工具

每晚8點直播講解C++編程技術。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 知識點: 注:int類型默認32位有大小范圍 且第一位為符號位 0 為正 1 為負 8.4作業 A:1、風力預警系...
    cGunsNRoses閱讀 1,112評論 0 0
  • zy1控制臺程序新建控制臺應用程序名字命名為:helloworldstatic void Main(string[...
    假裝我不帥閱讀 386評論 0 0
  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,483評論 0 17
  • 1.String與Stringbuilder的區別: String自動分配內存大小,每次往里面寫新東西,就會重新分...
    夕望有你閱讀 1,051評論 0 0
  • 16.1季氏將伐顓臾。冉有、季路見于孔子曰:“季氏將有事于顓臾。”孔子曰:“求!無乃爾是過與?夫顓臾,昔者先王以為...
    共剪西窗燭閱讀 1,788評論 0 0