探秘C# 6.0 的新特性

來源:互聯網
上載者:User

標籤:repos   com   eve   share   迴圈   短文法   原創   c#   過濾器   


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塊

//樣本 1try{  //Some code}catch (Exception ex) if (ex.InnerException == null){  //Do work}//Before C# 6 we write the above code as follows//樣本 1try{  //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;}//orvar userRank = UserID != null ? Rank : "No Rank"

有了這個特性之後方式

var userRank = UserID?.Rank ?? "No Rank";

以上所述就是本文的全部內容了,希望大家能夠喜歡。

除聲明外, 跑步客文章均為原創,轉載請以連結形式標明本文地址
  探秘C# 6.0 的新特性

本文地址:  http://www.paobuke.com/develop/c-develop/pbk23085.html






相關內容PropertyGrid自訂控制項使用詳解C#實現char字元數組與字串相互轉換的方法C# List 排序各種用法與比較詳解C#設計模式編程中產生器模式的使用
winform實現限制及解除滑鼠移動範圍的方法C#中前台線程和後台線程的區別與聯絡C#尋找列表中所有重複出現元素的方法C#實現下載網頁HTML源碼的方法

探秘C# 6.0 的新特性

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.