C 語言特性發展史 Intro 本文主要總結介紹C 每個版本帶來的不同的語言特性。 C ,讀作C Sharp,是微軟推出的一種基於.NET平臺的、面向對象的高級編程語言。是微軟公司在2000年發佈的一種新的編程語言,主要由安德斯·海爾斯伯格(Anders Hejlsberg)主持開發,它是第一個面向 ...
C# 語言特性發展史
Intro
本文主要總結介紹C# 每個版本帶來的不同的語言特性。
C#,讀作C Sharp,是微軟推出的一種基於.NET平臺的、面向對象的高級編程語言。是微軟公司在2000年發佈的一種新的編程語言,主要由安德斯·海爾斯伯格(Anders Hejlsberg)主持開發,它是第一個面向組件的編程語言,其源碼會編譯成msil再運行。它借鑒了Delphi的一個特點,與COM(組件對象模型)是直接集成的,並且新增了許多功能及語法糖。
C# 1.x
自 2000 年 C#1.0 發佈之後,微軟在2003年4月又發佈了 C# 1.1 主要是修複BUG,這裡統稱為1.x
- 面向對象
- 記憶體自動回收,GC
- 屬性
- 反射
C# 2
- 泛型
- 分部類
- 靜態類型
- 迭代器(yield return)
- 匿名方法(lambda 表達式)
- 可空類型
- 委托的協變逆變
- 屬性訪問器可以被單獨設置訪問級別
??
表達式
C# 3
- Linq
- 類型初始化器
- 集合初始化器
- 匿名類型
- 局部變數類型推斷(
var
) - Lambda 表達式
- 自動屬性
- 擴展方法
- 分部方法
- 表達式樹(Expression Tree)
C# 4
- 動態編程(
dynamic
) - 具名參數與可選參數
- 泛型的協變和逆變
- TPL任務並行庫,基於Task的非同步編程
C# 5
- 非同步編程(
async
&await
) - 調用方信息特性(
CallerMemberName
&CallerFilePath
&CallerLineNumber
)
C# 6
- 靜態導入(
using static
) - 異常過濾器(
when(ex.ExceptionCode == 111)
) - 屬性初始化器(
public int PageIndex {get;} = 1;
) 字典初始化器
private Dictionary<int, string> webErrors = new Dictionary<int, string> { [404] = "Page not Found", [302] = "Page moved, but left a forwarding address.", [500] = "The web server can't come out to play today." };
- 字元串插值(
$"abc{123}def"
) - nameof 運算符
- null判斷傳播運算符(
a?SomeProperty?.Abc??"abcd"
) - 表達式體方法(
int Add(int a,int b) => a+b;
) - catch和finally子句中支持 await
只讀自動屬性(
public int Count {get;}
)
C# 7
- out 變數(
int.TryParse("123", out var num);
) - 優化元祖支持,支持變數名(
(int max,int min) top = (3,1);
) - 廢棄變數(
if(int.TryParse("123",out _))
) - 模式匹配(
if(abc is int num)
switch...case支持模式匹配) - ref local and ref return(
ref return 123;
) - 本地方法(局部方法)
- 更多的支持表達式體方法(增加支持屬性和索引器上實現構造函數、終結器以及 get 和 set 訪問器)
- throw表達式
數字文本語法改進
誤讀的數值常量可能使第一次閱讀代碼時更難理解。 當這些數字被用作位掩碼或其他符號而非數字值時,通常會發生這種情況。 C# 7.0 包括兩項新功能,使得更容易以最可讀的方式寫入數字來用於預期用途:二進位文本和數字分隔符
public const int Sixteen = 0b0001_0000; public const int ThirtyTwo = 0b0010_0000; public const int SixtyFour = 0b0100_0000; public const int OneHundredTwentyEight = 0b1000_0000; public const long BillionsAndBillions = 100_000_000_000; public const double AvogadroConstant = 6.022_140_857_747_474e23; public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;
C# 7.1
- 非同步Main方法(
async Main()
) - 預設常值表達式(
Func<string, bool> whereClause = default;
) 推斷元組元素名稱
// C# 7 int count = 5; string label = "Colors used in the map"; var pair = (count: count, label: label); // C# 7.1 int count = 5; string label = "Colors used in the map"; var pair = (count, label); // element names are "count" and "label"
C# 7.2
- 語言版本選擇(支持在項目中指定要使用的C#版本)
數值文字中的前導下劃線
C# 7.0 中實現了對數字分隔符的支持,但這不允許文字值的第一個字元是
_
。 十六進位文本和二進位文件現可以_
開頭。int binaryValue = 0b_0101_0101;
private protected 訪問修飾符(可通過包含同一程式集中聲明的類或派生類來訪問成員)
C# 7.3(Preview)
- 元組支持相等性比較
- 新的泛型約束(Enum,Delegate,unmanaged)
- Ref 局部變數重新分配(Ref 局部變數和 ref 參數現在可通過 ref 分配運算符重新分配
= ref
) Stackalloc 初始化表達式
Span<int> x = stackalloc[] { 1, 2, 3 };
- 初始化表達式和查詢中的表達式變數
支持欄位的特性
允許自動實現的屬性上的 [field: …] 特性定位其支持欄位
// C# 7.3 [Serializable] public class Foo { [field: NonSerialized] public string MySecret { get; set; } } // above code equals the code below [Serializable] public class Foo { [NonSerialized] private string MySecret_backingField; public string MySecret { get { return MySecret_backingField; } set { MySecret_backingField = value; } } }
C# 8(Preview)
- 可空引用類型(引用類型預設不可為空,如果需要為可空則需要顯示聲明
string? abc = null;
)
Reference
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-6
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7-1
- https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-7-2
- https://docs.microsoft.com/zh-cn/visualstudio/releasenotes/vs2017-relnotes#csharp
- https://github.com/dotnet/csharplang
- https://baike.baidu.com/item/c%23/195147
- https://zh.wikipedia.org/wiki/C%E2%99%AF