一直用C#開發程序,.NET的功能愈來愈多,變化也挺大的,從最初的封閉,到如今的開源,功能不斷的增長,一直在進步。做爲C#的強烈支持者,C#的變化,我不能不關注,這篇文章主要介紹,C#6.0和C#7.0增長的功能。C#的發展史和.NET之前的版本,請看C#和.NET版本,這邊文章中有介紹。html
using static 加強功能可用於導入單個類的靜態方法。
例如:using static System.String;能夠直接用String類中的靜態方法,而不用string.XXXX算法
「異常篩選器」是肯定什麼時候執行catch中的程序, 若是用於異常篩選器的表達式計算結果爲 true,則 catch 子句將對異常執行正常處理,若是表達式計算結果爲 false,則將跳過 catch 子句。
例如:e.Message.Contains("test")爲true執行,不然不執行數組
try { throw new Exception("test"); } catch (Exception e) when (e.Message.Contains("test")) { Console.WriteLine("ce"); }
可讓屬性初始化,僅僅初始化一次,這適用於方法和只讀屬性
例如:異步
public class Class6 { public string LastName { get; set; } public string FirstName { get; set; } public string FullName => $"{FirstName} {LastName}"; public override string ToString() => $"{FirstName},{LastName}"; } //調用 Class6 test = new Class6(); 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
Null 條件運算符使 null 檢查更輕鬆、更流暢。 將成員訪問 . 替換爲 ?.
例如:var first = person?.FirstName; string test = null;string t = test?.ToString();
若是 Person 對象是 null,則將變量 first 賦值爲 null,不然,將 FirstName 屬性的值分配給該變量。【?.】的左側使用任何表達式(包括方法調用)async
nameof 表達式的計算結果爲符號的名稱,簡單來講就是爲了顯示名稱。
例如: string test = "測試"; Console.WriteLine($"{test} , nameof:{nameof(test)}");
結果:測試 , nameof:testide
索引初始值設定項就是對索引初始化,能夠像Cat cat = new Cat { Age = 10, Name = "Fluffy" };初始化值同樣,只不過如今增長了索引的初始化函數
C# 5 對於可放置 await 表達式的位置有若干限制。 使用 C# 6,如今能夠在 catch 或 finally 表達式中使用 await。
例如:性能
try { throw new Exception("test"); } catch (Exception e) when (e.Message.Contains("test")) { await Task.Run(() => { Console.WriteLine($"await catch"); }); } finally { await Task.Run(() => { Console.WriteLine($"await finally"); }); }
如今能夠在方法調用的參數列表中聲明 out 變量,而不是編寫單獨的聲明語句
例如:學習
if (int.TryParse("123", out int result)) Console.WriteLine(result)
須要包含多個數據元素的簡單結構的方法,也不知道怎麼解釋,總之就是好用。
例如:測試
(string Name, int Age) user = ("小紅", 18); Console.WriteLine($"Name:{user.Name}, Age:{user.Age}");
ValueTuple<string, int> valueTuple = new ValueTuple<string, int>("小紅", 18); //能夠和Tuple對比學習 Tuple<string, int> test = new Tuple<string, int>("小紅", 18); //ValueTuple是值類型,Tuple是引用類型
模式匹配 是一種可以讓你對除對象類型之外的屬性實現方法分派的功能,模式匹配支持 is 表達式和 switch 表達式。每一個表達式都容許檢查對象及其屬性以肯定該對象是否知足所尋求的模式,使用 when 關鍵字來指定模式的其餘規則。is 表達式的加強功能, 能夠針對值類型和引用類型進行測試。簡單來講就是幫你測試類型。
例如:
string test = "123"; if (test is int count) Console.WriteLine(count);
上面的例子會提示int類型的模式沒法處理string類型的表達式。
許多類的設計都包括僅從一個位置調用的方法。 這些額外的私有方法使每一個方法保持小且集中。 本地函數使你可以在另外一個方法的上下文內聲明方法 。 本地函數使得類的閱讀者更容易看到本地方法僅從聲明它的上下文中調用。簡單來講就是方法中寫方法。
例如:
public static int Test() { int count = Add(12, 10); return count; int Add(int a, int b) { return a + b; } }
此功能容許使用並返回對變量的引用的算法,這些變量在其餘位置定義。
例如:
class NumberStore { int[] numbers = { 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023 }; public ref int FindNumber(int target) { for (int ctr = 0; ctr < numbers.Length; ctr++) { if (numbers[ctr] >= target) return ref numbers[ctr]; } return ref numbers[0]; } public override string ToString() => string.Join(" ", numbers); } var store = new NumberStore(); Console.WriteLine($"Original sequence: {store.ToString()}"); int number = 16; ref var value = ref store.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了,對象中的數組值改變了,這個功能以爲要慎用。
一般,在進行元組解構或使用 out 參數調用方法時,必須定義一個其值可有可無且你不打算使用的變量。 爲處理此狀況,C# 增添了對棄元的支持 。 棄元是一個名爲 _(下劃線字符)的只寫變量,可向單個變量賦予要放棄的全部值。 棄元相似於未賦值的變量;不可在代碼中使用棄元(賦值語句除外)。簡單來講就是放棄不須要的值。
例如:
private static (string, double, int) Test(string name) { return (name, 1.234, 20); } //使用 var (name, _, age) = Test("測試"); Console.WriteLine($"測試棄元: Name:{name}, Age:{age}"); //運行結果:測試棄元: Name:測試, Age:20
誤讀的數值常量可能使第一次閱讀代碼時更難理解。 位掩碼或其餘符號值容易產生誤解。 C# 7.0 包括兩項新功能,可用於以最可讀的方式寫入數字來用於預期用途:二進制文本和數字分隔符 。簡單來講就是能夠把數字分割等
例如:
int test = 1_123_21; Console.WriteLine(test); //結果 112321
throw 始終是一個語句。 由於 throw 是一個語句而非表達式,因此在某些 C# 構造中沒法使用它。
例如:string test = false ? "" : throw new Exception("必須是字符串,不然報錯。");
異步方法返回類型不限於 Task、Task<T> 和 void,能夠是ValueTask<int>,可避免在性能上分配 Task。
能夠查看 【C#中await/async閒說】,這篇文章對異步性能進行了說明,對ValueTask的使用進行了說明
5. C#中泛型的解釋(object,list,var,dynamic的區別)
6. C#中委託
7. C#和.NET版本對比