欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

探秘C# 6.0 的新特性

 更新時(shí)間:2015年03月24日 11:40:50   投稿:hebedich  
本文的內(nèi)容包括引入C#6.0中的新的語(yǔ)言特性有哪些. 還有已經(jīng)被引入的代碼名稱為 “Roslyn”新編譯器. 編譯器是開放源碼的,并且可以從 codeplex 網(wǎng)站的這個(gè)地址下載到源代碼:https://roslyn.codeplex.com/.

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)文章

最新評(píng)論