探秘C# 6.0 的新特性
C# 6.0 中的新特性
我們可以對這些新特性一個一個的進行討論,而首先要列出 C# 6.0 中這些特性的一個清單
自動的屬性初始化器 Auto Property Initializer
主構造器 Primary Consturctor
字典初始化器 Dictionary Initializer
聲明表達式 Declaration Expression
靜態(tài)的Using Static Using
catch 塊中的 await
異常過濾器 Exception Filter
用于檢查NULL值的條件訪問操作符
1. 自動的屬性初始化器Auto Property initialzier
之前的方式
初始化一個自動屬性Auto Property的唯一方式,就是去實現一個明確的構造器,在里面對屬性值進行設置.
public class AutoPropertyBeforeCsharp6 { private string _postTitle = string.Empty; public AutoPropertyBeforeCsharp6() { //assign initial values PostID = 1; PostName = "Post 1"; } public long PostID { get; set; } public string PostName { get; set; } public string PostTitle { get { return _postTitle; } protected set { _postTitle = value; } } }
有了這個特性之后的方式
使用 C# 6 自動實現的帶有初始值的屬性可以不用編寫構造器就能被初始化. 我們可以用下面的代碼簡化上面的示例:
public class AutoPropertyInCsharp6 { public long PostID { get; } = 1; public string PostName { get; } = "Post 1"; public string PostTitle { get; protected set; } = string.Empty; }
2. 主構造器
我們使用構造器主要是來初始化里面的值.(接受參數值并將這些參數值賦值給實體屬性).
之前的方式
public class PrimaryConstructorsBeforeCSharp6 { public PrimaryConstructorsBeforeCSharp6(long postId, string postName, string postTitle) { PostID = postId; PostName = postName; PostTitle = postTitle; } public long PostID { get; set; } public string PostName { get; set; } public string PostTitle { get; set; } }
有了這個特性之后的方式
public class PrimaryConstructorsInCSharp6(long postId, string postName, string postTitle) { public long PostID { get; } = postId; public string PostName { get; } = postName; public string PostTitle { get; } = postTitle; }
在 C# 6 中, 主構造器為我們提供了使用參數定義構造器的一個簡短語法. 每個類只可以有一個主構造器.
如果你觀察上面的示例,會發(fā)現我們將參數初始化移動到了類名的旁邊.
你可能會得到下面這樣的錯誤“Feature ‘primary constructor' is only available in ‘experimental' language version.”(主構造器特性只在實驗性質的語言版本中可用),為了解決這個問題,我們需要編輯SolutionName.csproj 文件,來規(guī)避這個錯誤 . 你所要做的就是在WarningTag 后面添加額外的設置
<LangVersion>experimental</LangVersion>
‘主構造器'只在‘實驗'性質的語言版本中可用
3. 字典初始化器
之前的方式
編寫一個字典初始化器的老辦法如下
public class DictionaryInitializerBeforeCSharp6 { public Dictionary<string, string> _users = new Dictionary<string, string>() { {"users", "Venkat Baggu Blog" }, {"Features", "Whats new in C# 6" } }; }
有了這個特性之后的方式
我們可以像數組里使用方括號的方式那樣定義一個字典初始化器
public class DictionaryInitializerInCSharp6 { public Dictionary<string, string> _users { get; } = new Dictionary<string, string>() { ["users"] = "Venkat Baggu Blog", ["Features"] = "Whats new in C# 6" }; }
4. 聲明表達式
之前的方式
public class DeclarationExpressionsBeforeCShapr6() { public static int CheckUserExist(string userId) { //Example 1 int id; if (!int.TryParse(userId, out id)) { return id; } return id; } public static string GetUserRole(long userId) { ////Example 2 var user = _userRepository.Users.FindById(x => x.UserID == userId); if (user!=null) { // work with address ... return user.City; } } }
有了這個特性之后的方式
在 C# 6 中你可以在表達式的中間聲明一個本地變量. 使用聲明表達式我們還可以在if表達式和各種循環(huán)表達式中聲明變量
public class DeclarationExpressionsInCShapr6() { public static int CheckUserExist(string userId) { if (!int.TryParse(userId, out var id)) { return id; } return 0; } public static string GetUserRole(long userId) { ////Example 2 if ((var user = _userRepository.Users.FindById(x => x.UserID == userId) != null) { // work with address ... return user.City; } } }
5. 靜態(tài)的 Using
之前的方式
對于你的靜態(tài)成員而言,沒必要為了調用一個方法而去弄一個對象實例. 你會使用下面的語法
TypeName.MethodName public class StaticUsingBeforeCSharp6 { public void TestMethod() { Console.WriteLine("Static Using Before C# 6"); } }
之后的方式
在 C# 6 中,你不用類名就能使用靜態(tài)成員. 你可以在命名空間中引入靜態(tài)類.
如果你看了下面這個實例,就會看到我們將靜態(tài)的Console類移動到了命名空間中
using System.Console; namespace newfeatureincsharp6 { public class StaticUsingInCSharp6 { public void TestMethod() { WriteLine("Static Using Before C# 6"); } } }
6. catch塊里面的await
C# 6 之前catch和finally塊中是不能用await 關鍵詞的. 在 C# 6 中,我們終于可以再這兩個地方使用await了.
try { //Do something } catch (Exception) { await Logger.Error("exception logging") }
7. 異常過濾器
異常過濾器可以讓你在catch塊執(zhí)行之前先進行一個if條件判斷.
看看這個發(fā)生了一個異常的示例,現在我們想要先判斷里面的Exception是否為null,然后再執(zhí)行catch塊
//示例 1 try { //Some code } catch (Exception ex) if (ex.InnerException == null) { //Do work } //Before C# 6 we write the above code as follows //示例 1 try { //Some code } catch (Exception ex) { if(ex.InnerException != null) { //Do work; } }
8. 用于檢查NULL值的條件訪問操作符?.
看看這個實例,我們基于UserID是否不為null這個條件判斷來提取一個UserRanking.
之前的方式
var userRank = "No Rank"; if(UserID != null) { userRank = Rank; } //or var userRank = UserID != null ? Rank : "No Rank"
有了這個特性之后方式
var userRank = UserID?.Rank ?? "No Rank";
以上所述就是本文的全部內容了,希望大家能夠喜歡。
相關文章
C#實現的4種常用數據校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗)
本文主要介紹了C#實現的4種常用數據校驗方法小結(CRC校驗,LRC校驗,BCC校驗,累加和校驗),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03C#難點逐個擊破(6):C#數據類型與.net framework數據類型
最近開始看Illustrator C#2008,這真是一本好書,我讀計算機書籍這么多了,能讓我稱為好書的沒有多少。2010-02-02