C# 6.0 的新特性
本文的內容包括引入C#6.0中的新的語言特性有哪些. 還有已經被引入的程式碼名稱為 “Roslyn”新編譯器. 編譯器是開放原始碼的,並且可以從 codeplex 網站的這個地址下載到原始碼: https://roslyn.codeplex.com/.
C# 6.0 中的新特性
我們可以對這些新特性一個一個的進行討論,而首先要列出 C# 6.0 中這些特性的一個清單
-
自動的屬性初始化器 Auto Property Initializer
-
主構造器 Primary Consturctor
-
字典初始化器 Dictionary Initializer
-
宣告表示式 Declaration Expression
-
靜態的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 中, 主構造器為我們提供了使用引數定義構造器的一個簡短語法. 每個類只可以有一個主構造器.
如果你觀察上面的示例,會發現我們將引數初始化移動到了類名的旁邊.
你可能會得到下面這樣的錯誤“Feature ‘primary constructor’ is only available in ‘experimental’ language version.”(主構造器特性只在實驗性質的語言版本中可用), 為了解決這個問題,我們需要編輯 SolutionName.csproj 檔案,來規避這個錯誤 . 你所要做的就是在 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表示式和各種迴圈表示式中宣告變數
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. 靜態的 Using
之前的方式
對於你的靜態成員而言,沒必要為了呼叫一個方法而去弄一個物件例項. 你會使用下面的語法
TypeName.MethodNamepublic class StaticUsingBeforeCSharp6 { public void TestMethod() { Console.WriteLine("Static Using Before C# 6"); } }
之後的方式
在 C# 6 中,你不用類名就能使用 靜態成員 . 你可以在名稱空間中引入靜態類.
如果你看了下面這個例項,就會看到我們將靜態的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塊執行之前先進行一個 if 條件判斷.
看看這個發生了一個異常的示例,現在我們想要先判斷裡面的Exception是否為null,然後再執行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# 6.0中的新特性 第一次出現在 Venkat Baggu 部落格 上.
原文地址:http://www.codeproject.com/Articles/874205/New-features-in-Csharp
相關文章
- C# 6.0 的新特性總結C#
- C# 6.0新特性(轉載)C#
- C# 6.0的新特性靈感是來自Scala嗎?C#
- C#新特性C#
- C# 10的新特性C#
- AnalyticDB for PostgreSQL 6.0 新特性介紹SQL
- JDK6.0的新特性:使用Compiler APIJDKCompileAPI
- JDK6.0的新特性之三:理解StAXJDK
- C# 9.0新特性C#
- C# 2.0 新特性C#
- EF Core 6.0 Azure Cosmos DB Provider的新特性IDE
- JDK6.0的新特性之四:使用Compiler APIJDKCompileAPI
- TiDB 6.0 新特性解讀 | Collation 規則TiDB
- JDK6.0的新特性之五:輕量級Http ServerJDKHTTPServer
- JDK6.0的新特性之一:Desktop和SystemTray類JDK
- C# 11 都有哪些新特性?C#
- C# 7.0 語言新特性C#
- TiDB 6.0 新特性解讀丨 Collation 規則TiDB
- C# 9 新特性 —— 增強的 foreachC#
- C# 9 新特性 —— 增強的模式匹配C#模式
- 簡短介紹 C# 6 的新特性C#
- Redis 6.0 新特性-多執行緒連環13問!Redis執行緒
- ECMAScript6.0新特性介紹第七篇
- C# 9 新特性——init only setterC#
- C# 7.0 新特性(3): 模式匹配C#模式
- [譯] PowerShell Core 6.0 的新增特性
- 你所不知道的 C# 10新特性C#
- 溫故而知新:c#中的特性(attribute)C#
- C# 8.0的三個令人興奮的新特性C#
- C# 6.0的Dictionary語法C#
- C# 7.0 新特性(2): 本地方法C#
- 說說 C# 9 新特性的實際運用C#
- 一小時學會 C# 6 的新特性C#
- C# 9.0 新特性之模式匹配簡化C#模式
- JDK6.0與JDK4.0相比有什麼新特性JDK
- C# 11 的這個新特性,我願稱之最強!C#
- C# 9.0中引入的新特性init和record的使用思考C#
- C# 9.0 新特性之 Lambda 棄元引數C#