C#各個版本中的新增特性詳解

序言

自從2000年初期發佈以來,c#編程語言不斷的獲得改進,使咱們可以更加清晰的編寫代碼,也更加容易維護咱們的代碼,加強的功能已經從1.0搞到啦7.0甚至7.1,每一次改過都伴隨着.NET Framework庫的相應支持,也不斷的帶給咱們期待與驚喜。下面咱們就對c#一路走到如今,作一個回顧與學習。git

C#語言目標與前行

c#的設計目標是有如下幾點:程序員

  • 旨在是一種簡單,現代,通用的面向對象編程語言。github

  • 語言及其實現應該爲軟件工程原理提供支持,例如強類型檢查,數組維度檢查,未初始化的變量引用檢測以及自動垃圾收集。軟件的魯棒性,耐久性和程序員的生產力很重要。編程

  • 旨在用於開發適用於分佈式環境中部署的軟件組件。c#

  • 便攜性對於源代碼和程序員很是重要,特別是已經熟悉C和C ++的程序員。數組

  • 支持國際化是很是重要的。異步

  • C#適用於爲託管和嵌入式系統編寫應用程序,從使用複雜的操做系統到很是小的專用功能都很是適用。編程語言

  • 雖然C#應用程序在內存和處理能力要求方面是經濟的,可是該語言並不打算直接用C或彙編語言直接與性能和尺寸進行競爭。分佈式

c#版本函數

c#版本中添加的功能:

C#2.0 

  • 泛型

  • 部分類型

  • 匿名方法

  • 迭代器

  • 可空類型

  • Getter / setter單獨可訪問性

  • 方法組轉換(表明)

  • Co- and Contra-variance for delegates

  • 靜態類

  • Delegate inference

C#3.0 

  • 隱式類型局部變量

  • 對象和收集初始化器

  • 自動實現的屬性

  • 匿名類型

  • 擴展方法

  • 查詢表達式

  • Lambda表達式

  • 表達樹

  • 部分方法

C#4.0 

  • 動態綁定

  • 命名和可選參數

  • Generic co- and contravariance

  • 嵌入式互操做類型(「NoPIA」)

C#5.0 

  • 異步方法

  • Caller info attributes

C#6.0 

  • Compiler-as-a-service(Roslyn)

  • 將靜態類型成員導入命名空間

  • 異常過濾器

  • 在Catch和Finally中使用Await

  • 自動屬性初始化器

  • 只讀屬性的默認值

  • Expression-bodied members

  • Null-conditional operators(空條件運算符,簡潔檢查)

  • 字符串插值

  • nameof operator
  • 字典初始化器

C#7.0 

  • out變量

  • 模式匹配

  • 元組

  • 解構

  • 局部函數

  • 數字分隔符

  • 二進制文字

  • 局部引用和引用返回

  • 擴展異步返回類型

  • 表達式的構造函數和finalizers

  • Expression bodied getters and setters
  • throw表達式

C#7.1 

  • Async main
  • 默認表達式

參考文檔:https://en.wikipedia.org/wiki/C_Sharp_(programming_language)#cite_note-roslyn_6-47

c#7.0新特性詳解

在2016年Visual Studio 「15」 Preview 4發佈,c# 7.0便開始浮現,如今vs2017已經發布,c#7.0帶給咱們的驚喜,咱們也該一探究竟啦。

C#7.0增長許多新功能,重點是數據,代碼簡化和性能上。

Out variables

目前在C#中,使用out參數不像咱們想要的那麼流暢。在使用out參數調用一個方法以前,首先必須聲明變量來傳遞給它。您也不能使用var它們來聲明它們,但須要指定完整的類型。

public void PrintCoordinates(Point p)
{
    int x, y; //必須聲明
    p.GetCoordinates(out x, out y);
    WriteLine($"({x}, {y})");
}

在c#7中再來看看

public void PrintCoordinates(Point p)
{
    p.GetCoordinates(out int x, out int y);
    WriteLine($"({x}, {y})");
}

模式匹配

c#7中

public static void PrintStars(object o)
        {
            if (o is int i) Console.WriteLine(i + 12);
        }

之前版本須要轉化

public static void PrintStars(object o)
        {
            if (o is int) Console.WriteLine(Convert.ToInt32(o) + 12);
        }

Switch statements with patterns 擴展switch語句使用模式匹配

  public static void PrintStars(object o)
        {
            switch (o)
            {
                case Print p:
                    break;
                case int a:
                    break;
                case String b when b=="123":
                    break;
            }
        }        
    }   
    public class Print
    {
        public string PrintName { get; set; }
        public string MoBanPath { get; set; }
        public int Count { get; set; }
    }

元組(Tuples)

注意:元組依賴於一組基礎類型,不包括在預覽4中。要使功能正常工做,您能夠經過NuGet輕鬆獲取它們:

  • 右鍵單擊解決方案資源管理器中的項目,而後選擇「管理NuGet軟件包...」

  • 選擇「瀏覽」選項卡,選中「包含預發行」,而後選擇「nuget.org」做爲「包源」

  • 搜索「System.ValueTuple」並安裝它。

  static void Main(string[] args)
        {
            var tuple = (a: 10, b: "123");
            Console.WriteLine($"a:{tuple.a},b:{tuple.b}");
            var result1 = GetS();
            var result = Get();
            Console.WriteLine($"Item1:{result1.Item1},Item2:{result1.Item2},Item3:{result1.Item3}");
            Console.WriteLine($"a:{result.a},b:{result.b},c:{result.c}");
            Console.ReadLine();
        }
        static (string, int, DateTime) GetS()
        {
            return ("abc", 123, DateTime.Now);
        }
        static (string a, int b, DateTime c) Get()
        {
            return (a: "abc", b: 123, c: DateTime.Now);
        }

局部函數

簡單的說,就是在方法裏面寫方法而後本身調用。

注意:在預覽4中,本地函數必須在調用以前聲明。這個限制將被鬆開,因此一旦他們讀取的局部變量被明確地分配,就能夠調用這個限制。

static void Main(string[] args)
        {
            Console.WriteLine($"{Get(123)},{Get("abc")},{Get(null)}");
            Console.ReadLine();
        }

        public static string Get(object a)
        {           
            return GetP();
            string GetP()
            {
                if (a is int v) return v + "";
                if (a is string b) return b;
                return "ccc";
            }
        }

Literal improvements

C#7.0容許在數字文字中_做爲數字分隔符出現

var d = 123_456;
var x = 0xAB_CD_EF;

你能夠把它們放在數字之間,以提升可讀性。它們對價值沒有影響。

另外,C#7.0引入了二進制文字,所以您能夠直接指定位模式,而沒必要以心臟知道十六進制符號。 

var b = 0b1010_1011_1100_1101_1110_1111;

更多c#7.0的特性

到此,我就不在一個個的上演c#7.0的其餘功能啦。若是你想深刻其餘,仔細閱讀下面的文檔:

請參考文檔:https://blogs.msdn.microsoft.com/dotnet/2016/08/24/whats-new-in-csharp-7-0/

c#6.0新語言功能詳解

如下新功能在VS 2015及17中實現並可用。

ADD:新增,Exists:已存在,N/A:對該語言沒有意義,No:不適用此版本。

下面我簡述幾個新功能,剩下的我會把文檔鏈接拿出來本身觀摩。

字符串插值

上面的代碼中都有體現。

var s = $"{p.Name} is {p.Age} year{{s}} old";

字典索引初始化

var numbers = new Dictionary<int, string> {
    [7] = "seven",
    [9] = "nine",
    [13] = "thirteen"
};

自動屬性初始化

public class Customer
{
    public string First { get; set; } = "Jane";
    public string Last { get; set; } = "Doe";
}

using引用靜態類

using static System.Console;
using static System.Math;
using static System.DayOfWeek;
class Program
{
    static void Main()
    {
        WriteLine(Sqrt(3*3 + 4*4)); 
        WriteLine(Friday - Monday); 
    }
}

更多c#6.0語言新特性

線上代碼可執行演示文檔鏈接:http://www.volatileread.com/Wiki/Index?id=1075 效果以下

參考文檔:https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6

c#2.0-5.0參考文檔

c#5.0參考文檔

鏈接地址:https://blogs.msdn.microsoft.com/mvpawardprogram/2012/03/26/an-introduction-to-new-features-in-c-5-0/

c#4.0參考文檔

鏈接地址:https://msdn.microsoft.com/en-us/magazine/ff796223.aspx

c#3.0參考文檔

鏈接地址:https://msdn.microsoft.com/en-us/library/bb308966.aspx

c#2.0參考文檔

鏈接地址:https://msdn.microsoft.com/en-us/library/7cz8t42e(v=vs.80).aspx

總結

接下來是你們最喜歡的總結內容啦,內容有二,以下:

一、但願能關注我其餘的文章。

二、博客裏面有沒有很清楚的說明白,或者你有更好的方式,那麼歡迎加入左上方的2個交流羣,咱們一塊兒學習探討。

相關文章
相關標籤/搜索