探秘C# 6.0 的新特性
C# 6.0 中的新特性
我們可以對(duì)這些新特性一個(gè)一個(gè)的進(jìn)行討論,而首先要列出 C# 6.0 中這些特性的一個(gè)清單
自動(dòng)的屬性初始化器 Auto Property Initializer
主構(gòu)造器 Primary Consturctor
字典初始化器 Dictionary Initializer
聲明表達(dá)式 Declaration Expression
靜態(tài)的Using Static Using
catch 塊中的 await
異常過(guò)濾器 Exception Filter
用于檢查NULL值的條件訪問操作符
1. 自動(dòng)的屬性初始化器Auto Property initialzier
之前的方式
初始化一個(gè)自動(dòng)屬性Auto Property的唯一方式,就是去實(shí)現(xiàn)一個(gè)明確的構(gòu)造器,在里面對(duì)屬性值進(jìn)行設(shè)置.
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; } } }
有了這個(gè)特性之后的方式
使用 C# 6 自動(dòng)實(shí)現(xiàn)的帶有初始值的屬性可以不用編寫構(gòu)造器就能被初始化. 我們可以用下面的代碼簡(jiǎn)化上面的示例:
public class AutoPropertyInCsharp6 { public long PostID { get; } = 1; public string PostName { get; } = "Post 1"; public string PostTitle { get; protected set; } = string.Empty; }
2. 主構(gòu)造器
我們使用構(gòu)造器主要是來(lái)初始化里面的值.(接受參數(shù)值并將這些參數(shù)值賦值給實(shí)體屬性).
之前的方式
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; } }
有了這個(gè)特性之后的方式
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 中, 主構(gòu)造器為我們提供了使用參數(shù)定義構(gòu)造器的一個(gè)簡(jiǎn)短語(yǔ)法. 每個(gè)類只可以有一個(gè)主構(gòu)造器.
如果你觀察上面的示例,會(huì)發(fā)現(xiàn)我們將參數(shù)初始化移動(dòng)到了類名的旁邊.
你可能會(huì)得到下面這樣的錯(cuò)誤“Feature ‘primary constructor' is only available in ‘experimental' language version.”(主構(gòu)造器特性只在實(shí)驗(yàn)性質(zhì)的語(yǔ)言版本中可用),為了解決這個(gè)問題,我們需要編輯SolutionName.csproj 文件,來(lái)規(guī)避這個(gè)錯(cuò)誤 . 你所要做的就是在WarningTag 后面添加額外的設(shè)置
<LangVersion>experimental</LangVersion>
‘主構(gòu)造器'只在‘實(shí)驗(yàn)'性質(zhì)的語(yǔ)言版本中可用
3. 字典初始化器
之前的方式
編寫一個(gè)字典初始化器的老辦法如下
public class DictionaryInitializerBeforeCSharp6 { public Dictionary<string, string> _users = new Dictionary<string, string>() { {"users", "Venkat Baggu Blog" }, {"Features", "Whats new in C# 6" } }; }
有了這個(gè)特性之后的方式
我們可以像數(shù)組里使用方括號(hào)的方式那樣定義一個(gè)字典初始化器
public class DictionaryInitializerInCSharp6 { public Dictionary<string, string> _users { get; } = new Dictionary<string, string>() { ["users"] = "Venkat Baggu Blog", ["Features"] = "Whats new in C# 6" }; }
4. 聲明表達(dá)式
之前的方式
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; } } }
有了這個(gè)特性之后的方式
在 C# 6 中你可以在表達(dá)式的中間聲明一個(gè)本地變量. 使用聲明表達(dá)式我們還可以在if表達(dá)式和各種循環(huán)表達(dá)式中聲明變量
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
之前的方式
對(duì)于你的靜態(tài)成員而言,沒必要為了調(diào)用一個(gè)方法而去弄一個(gè)對(duì)象實(shí)例. 你會(huì)使用下面的語(yǔ)法
TypeName.MethodName public class StaticUsingBeforeCSharp6 { public void TestMethod() { Console.WriteLine("Static Using Before C# 6"); } }
之后的方式
在 C# 6 中,你不用類名就能使用靜態(tài)成員. 你可以在命名空間中引入靜態(tài)類.
如果你看了下面這個(gè)實(shí)例,就會(huì)看到我們將靜態(tài)的Console類移動(dòng)到了命名空間中
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 關(guān)鍵詞的. 在 C# 6 中,我們終于可以再這兩個(gè)地方使用await了.
try { //Do something } catch (Exception) { await Logger.Error("exception logging") }
7. 異常過(guò)濾器
異常過(guò)濾器可以讓你在catch塊執(zhí)行之前先進(jìn)行一個(gè)if條件判斷.
看看這個(gè)發(fā)生了一個(gè)異常的示例,現(xiàn)在我們想要先判斷里面的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值的條件訪問操作符?.
看看這個(gè)實(shí)例,我們基于UserID是否不為null這個(gè)條件判斷來(lái)提取一個(gè)UserRanking.
之前的方式
var userRank = "No Rank"; if(UserID != null) { userRank = Rank; } //or var userRank = UserID != null ? Rank : "No Rank"
有了這個(gè)特性之后方式
var userRank = UserID?.Rank ?? "No Rank";
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
C#定義并實(shí)現(xiàn)單鏈表實(shí)例解析
這篇文章主要介紹了C#定義并實(shí)現(xiàn)單鏈表實(shí)例解析,有助于讀者加深對(duì)C#實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的理解,需要的朋友可以參考下2014-07-07C#實(shí)現(xiàn)的4種常用數(shù)據(jù)校驗(yàn)方法小結(jié)(CRC校驗(yàn),LRC校驗(yàn),BCC校驗(yàn),累加和校驗(yàn))
本文主要介紹了C#實(shí)現(xiàn)的4種常用數(shù)據(jù)校驗(yàn)方法小結(jié)(CRC校驗(yàn),LRC校驗(yàn),BCC校驗(yàn),累加和校驗(yàn)),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C#難點(diǎn)逐個(gè)擊破(6):C#數(shù)據(jù)類型與.net framework數(shù)據(jù)類型
最近開始看Illustrator C#2008,這真是一本好書,我讀計(jì)算機(jī)書籍這么多了,能讓我稱為好書的沒有多少。2010-02-02C# Onnx實(shí)現(xiàn)特征匹配DeDoDe檢測(cè)
這篇文章主要為大家詳細(xì)介紹了C# Onnx如何實(shí)現(xiàn)特征匹配DeDoDe檢測(cè),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11基于C#實(shí)現(xiàn)的輕量級(jí)多線程隊(duì)列圖文詳解
這篇文章主要給大家介紹了關(guān)于基于C#實(shí)現(xiàn)的輕量級(jí)多線程隊(duì)列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08C# ADO.NET 離線查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了C# ADO.NET 離線查詢的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05