C# 6.0 的新特性

jopen 9年前發布 | 6K 次閱讀 C#

本文的內容包括引入C#6.0中的新的語言特性有哪些. 還有已經被引入的代碼名稱為 “Roslyn”新編譯器. 編譯器是開放源碼的,并且可以從 codeplex 網站的這個地址下載到源代碼: https://roslyn.codeplex.com/.

C# 6.0 中的新特性

我們可以對這些新特性一個一個的進行討論,而首先要列出 C# 6.0 中這些特性的一個清單

  1.         自動的屬性初始化器 Auto Property Initializer
    
    </li>
    <li>
    
            主構造器 Primary Consturctor
    
    </li>
    <li>
    
            字典初始化器 Dictionary Initializer
        <p></p>
    </li>
    <li>
    
            聲明表達式 Declaration Expression
        <p></p>
    </li>
    <li>
    
            靜態的Using Static Using
        <p></p>
    </li>
    <li>
    
            catch 塊中的 await
    
    </li>
    <li>
    
            異常過濾器 Exception Filter
    
    </li>
    <li>
    
            用于檢查NULL值的條件訪問操作符
    
    </li>
    

    </ol>

    1. 自動的屬性初始化器Auto Property initialzier</h2>
    

    之前的方式

    初始化一個自動屬性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;         }     } }</pre>

    有了這個特性之后的方式

    使用 C# 6 自動實現的帶有初始值的屬性可以不用編寫構造器就能被初始化. 我們可以用下面的代碼簡化上面的示例:

    public class AutoPropertyInCsharp6
    {
        public long PostID { get;  } = 1;

        public string PostName { get; } = "Post 1";

        public string PostTitle { get; protected set; } = string.Empty; }</pre>

    2. 主構造器<br />
    

    </h1>

    我們使用構造器主要是來初始化里面的值.(接受參數值并將這些參數值賦值給實體屬性).

    之前的方式

    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; } }</pre>

    有了這個特性之后的方式

    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>

    Feature 'primary constructor' is only available in 'experimental' language version

    ‘主構造器’只在‘實驗’性質的語言版本中可用

    3. 字典初始化器<br />
    

    </h2>

    之前的方式

    編寫一個字典初始化器的老辦法如下

    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. 聲明表達式</h2>
    

    之前的方式

    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;         }     } }</pre>

    有了這個特性之后的方式

    在 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;         }     } }</pre>

    5. 靜態的 Using</h2>
    

    之前的方式

    對于你的靜態成員而言,沒必要為了調用一個方法而去弄一個對象實例. 你會使用下面的語法

    TypeName.MethodName
    public 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<br />
    

    </h2>

    C# 6 之前catch和finally塊中是不能用 await 關鍵詞的. 在 C# 6 中,我們終于可以再這兩個地方使用await了.

    try 
    {          
      //Do something
    }
    catch (Exception)
    {
      await Logger.Error("exception logging")
    }

    7. 異常過濾器</h2>
    

    異常過濾器可以讓你在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;     } }</pre>

    8. 用于檢查NULL值的條件訪問操作符?.</h2>
    

    看看這個實例,我們基于UserID是否不為null這個條件判斷來提取一個UserRanking.

    之前的方式

    var userRank = "No Rank";
    if(UserID != null)
    {
        userRank = Rank;
    }

    //or

    var userRank = UserID != null ? Rank : "No Rank"</pre>

    有了這個特性之后方式

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

    C# 6.0中的新特性 第一次出現在 Venkat Baggu 博客 上.

     本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!