目錄
- C# Language Design
- C# Language Specification
- C# Language Feature
- C# 1.0 - Visual Studio .NET 2002
- C# 1.2 - Visual Studio .NET 2003
- C# 2.0 - Visual Studio 2005
- C# 3.0 - Visual Studio 2008
- C# 4.0 - Visual Studio 2010
- C# 5.0 - Visual Studio 2012
- C# 6.0 - Visual Studio 2015
- C# 7.0 - Visual Studio 2017
- C# 7.1 - Visual Studio 2017 version 15.3
- C# 7.2 - Visual Studio 2017 version 15.5
- C# 7.3 - Visual Studio 2017 version 15.7
- C# 8.0 - .NET Core 3.0 and Visual Studio 2019 version 16.3
- C# 9.0
- Reference
C# Language Design
- 語言規范:https://github.com/dotnet/csharplang
- 最新特性:https://github.com/dotnet/roslyn/blob/master/docs/Language Feature Status.md
- 歷史特性:https://github.com/dotnet/csharplang/blob/master/Language-Version-History.md
- .NET文檔:https://docs.microsoft.com/zh-cn/dotnet/
C# Language Specification
Standard ECMA-334
- 2002.12,包含C# 1.0,C# 1.1,C# 1.2。
- 2006.06,包含C# 2.0。
- 2017.12,C# 5.0版本,最新版本。
Microsoft
Version | Date | .NET Framework | CLR | Visual Studio |
---|---|---|---|---|
C# 1.0 | 2002.01 | .NET Framework 1.0 | 1.0 | VS 2002 |
C# 1.1 C# 1.2 |
2003.10 | .NET Framework 1.1 | 1.1 | VS 2003 |
C# 2.0 | 2005.11 | .NET Framework 2.0 | 2.0 | VS 2005 |
C# 3.0 | 2007.11 | .NET Framework 2.0 .NET Framework 3.0 .NET Framework 3.5 |
2.0 | VS 2008 VS 2010 |
C# 4.0 | 2010.04 | .NET Framework 4 | 4.0 | VS 2010 |
C# 5.0 | 2012.08 | .NET Framework 4.5 .NET Framework 4.5.1 |
4.0 | VS 2012 VS 2013 |
C# 6.0 | 2015.07 | .NET Framework 4.6 | 4.0 | VS 2015 |
C# 7.0 | 2017.03 | .NET Framework 4.6.2 | 4.0 | VS 2017 |
C# 7.1 | 2017.08 | .NET Framework 4.7 | 4.0 | VS 2017 v15.3 |
C# 7.2 | 2017.11 | .NET Framework 4.7.1 | 4.0 | VS 2017 v15.5 |
C# 7.3 | 2018.05 | .NET Framework 4.7.2 | 4.0 | VS 2017 v15.7 |
C# 8.0 | 2019.10 | .NET Framework 4.8 | 4.0 | VS 2019 v16.3 |
C# Language Feature
C# 1.0 - Visual Studio .NET 2002
- Classes:類,面向對象特性
- Structs:結構
- Interfaces:接口
- Events:事件
- Properties:屬性,類的成員,提供訪問字段的靈活方法。
- Delegates:委托,一種引用類型,表示對具有特定參數列表和返回類型的方法的引用,類似於函數指針。
- Expressions:表達式
- Statements:語句是以分號結尾的單行代碼,也可以是語句塊中的一系列單行語句。 語句塊括在括號 {} 中,並且可以包含嵌套塊。
- Attributes:特性,為程序代碼添加元數據或聲明性信息,運行時,通過反射可以訪問特性信息。
- Literals:字面量,也就是不用通過構造函數來創建值
C# 1.2 - Visual Studio .NET 2003
-
Dispose in foreach:當 IEnumerator 實現 IDisposable 時,foreach 循環中生成的代碼會在 IEnumerator 上調用 Dispose。
-
foreach over string specialization:foreach上的字符串特化。
C# 2.0 - Visual Studio 2005
- Generics:泛型
- Partial types:可以將類、結構、接口等類型定義拆分到多個文件中
- Anonymous methods:匿名方法
- Iterators:迭代器
- Nullable types:可為空的值類型
- Getter/setter separate accessibility:屬性訪問控制
- Method group conversions (delegates):方法組轉換,可以將聲明委托代表一組方法,隱式調用
- Co- and Contra-variance for delegates and interfaces:協變和逆變能夠實現數組類型、委托類型參數的隱式引用轉換。 協變保留分配兼容性,逆變則與之相反。
- Static classes:靜態類
- Delegate inference:委托推斷,將一個方法的地址傳送給一個委托變量,編譯器會自動檢測委托變量的委托類型,然后根據委托類型創建委托實例,並把方法地址傳送給委托的構造函數。
C# 3.0 - Visual Studio 2008
- Implicitly typed local variables:隱式類型變量,用var聲明的變量
- Object and collection initializers:對象和集合初始化器
- Auto-Implemented properties:自動屬性,自動生成屬性方法,聲明更簡潔。
- Anonymous types:匿名類型
- Extension methods:擴展方法
- Query expressions:查詢表達式
- Lambda expression:Lambda表達式
- Expression trees:表達式樹,以樹形數據結構表示代碼,是一種新數據類型
- Partial methods:部分方法
C# 4.0 - Visual Studio 2010
- Dynamic binding:動態綁定
- Named and optional arguments:命名參數和可選參數
- Co- and Contra-variance for generic delegates and interfaces:泛型類型的協變和逆變
- Embedded interop types ("NoPIA"):開啟嵌入類型信息,增加引用COM組件程序的中立性
C# 5.0 - Visual Studio 2012
- Asynchronous methods:異步方法
- Caller info attributes:調用方信息特性,被調用時訪問調用者的信息
- foreach loop was changed to generates a new loop variable rather than closing over the same variable every time:foreach循環生成一組新變量而不是每次都隱藏舊變量
C# 6.0 - Visual Studio 2015
- Draft Specification online
- Compiler-as-a-service (Roslyn):用C#編寫的C#編譯器
- Import of static type members into namespace:支持命名空間引入靜態成員
- Exception filters:異常過濾器
- Await in catch/finally blocks:支持在catch/finally語句塊使用await語句
- Auto property initializers:自動屬性初始化
- Default values for getter-only properties:設置只帶有getter的只讀屬性的默認值
- Expression-bodied members:支持以表達式為主體的成員方法和只讀屬性
- Null propagator (null-conditional operator, succinct null checking):Null條件操作符
- String interpolation:字符串插值,產生特定格式字符串的新方法
- nameof operator:nameof操作符,返回方法、屬性、變量的名稱
- Dictionary initializer:字典初始化
C# 7.0 - Visual Studio 2017
- Out variables:Out變量
- Pattern matching:模式匹配,根據對象類型或者其它屬性實現方法派發
- Tuples:元組
- Deconstruction:元組析構函數
- Discards:棄元,沒有命名的變量,只是占位,后面代碼不需要使用其值
- Local Functions:局部函數
- Binary Literals:二進制字面量
- Digit Separators:數字分隔符
- Ref returns and locals:引用返回值和局部變量
- Generalized async return types:async中使用泛型返回類型
- More expression-bodied members:允許構造器、解析器、屬性可以使用表達式作為主體
- Throw expressions:Throw可以在表達式中使用
C# 7.1 - Visual Studio 2017 version 15.3
- Async main:異步main方法
- Default expressions:默認文本表達式
- Reference assemblies:生成引用程序及
- Inferred tuple element names:推斷元組元素名稱
- Pattern-matching with generics:泛型類型參數的模式匹配
C# 7.2 - Visual Studio 2017 version 15.5
- Span and ref-like types:Span和類引用類型編譯時的安全執行
- In parameters and readonly references:針對實參的
in
修飾符和針對方法返回的ref readonly
修飾符,可以在編寫安全高效的代碼中詳細了解所有這些更改。 - Ref conditional:條件 ref 表達式
- Non-trailing named arguments:非尾隨命名參數
- Private protected accessibility:Private Protected 訪問修飾符
- Digit separator after base specifier:允許0b或者0x開頭的數值中帶下划線
C# 7.3 - Visual Studio 2017 version 15.7
System.Enum
,System.Delegate
andunmanaged
constraints.- Ref local re-assignment: Ref locals and ref parameters can now be reassigned with the ref assignment operator (
= ref
). - Stackalloc initializers: Stack-allocated arrays can now be initialized, e.g.
Span x = stackalloc[] { 1, 2, 3 };
. - Indexing movable fixed buffers: Fixed buffers can be indexed into without first being pinned.
- Custom
fixed
statement: Types that implement a suitableGetPinnableReference
can be used in afixed
statement. - Improved overload candidates: Some overload resolution candidates can be ruled out early, thus reducing ambiguities.
- Expression variables in initializers and queries: Expression variables like
out var
and pattern variables are allowed in field initializers, constructor initializers and LINQ queries. - Tuple comparison: Tuples can now be compared with
==
and!=
. - Attributes on backing fields: Allows
[field: …]
attributes on an auto-implemented property to target its backing field.
C# 8.0 - .NET Core 3.0 and Visual Studio 2019 version 16.3
- Nullable reference types: express nullability intent on reference types with
?
,notnull
constraint and annotations attributes in APIs, the compiler will use those to try and detect possiblenull
values being dereferenced or passed to unsuitable APIs. - Default interface members: interfaces can now have members with default implementations, as well as static/private/protected/internal members except for state (ie. no fields).
- Recursive patterns: positional and property patterns allow testing deeper into an object, and switch expressions allow for testing multiple patterns and producing corresponding results in a compact fashion.
- Async streams:
await foreach
andawait using
allow for asynchronous enumeration and disposal ofIAsyncEnumerable
collections andIAsyncDisposable
resources, and async-iterator methods allow convenient implementation of such asynchronous streams. - Enhanced using: a
using
declaration is added with an implicit scope andusing
statements and declarations allow disposal ofref
structs using a pattern. - Ranges and indexes: the
i..j
syntax allows constructingSystem.Range
instances, the^k
syntax allows constructingSystem.Index
instances, and those can be used to index/slice collections. - Null-coalescing assignment:
??=
allows conditionally assigning when the value is null. - Static local functions: local functions modified with
static
cannot capturethis
or local variables, and local function parameters now shadow locals in parent scopes. - Unmanaged generic structs: generic struct types that only have unmanaged fields are now considered unmanaged (ie. they satisfy the
unmanaged
constraint). - Readonly members: individual members can now be marked as
readonly
to indicate and enforce that they do not modify instance state. - Stackalloc in nested contexts:
stackalloc
expressions are now allowed in more expression contexts. - Alternative interpolated verbatim strings:
@$"..."
strings are recognized as interpolated verbatim strings just like$@"..."
. - Obsolete on property accessors: property accessors can now be individually marked as obsolete.
- Permit
t is null
on unconstrained type parameter
C# 9.0
- Records and Pattern-based With-Expression:Records是一種輕量級的不可變類型。
- Type Classes:Type Classes允許您在類型上添加一組操作,但不實現它。
- Dictionary Literals:字典字面量。
- Params Span<T>:允許用params修飾Span<T>。
- Allow no-arg constructor and field initializers in struct declarations:結構體允許使用無參構造函數。
- Native-Sized Number Types:原生大小的數字類型(nint,nuint,nfloat等)'n'表示
native(原生)
,該特性允許聲明一個32位或64位的數據類型,這取決於操作系統的平台類型。 - Fixed Sized Buffers:固定大小的緩沖區。
- Uft8 string literals:新的字符串類型UTF8String。
- Base(T):解決默認接口方法中的覆蓋沖突問題。