C# Language Design
- 语言规范:https://github.com/dotnet/csharplang
- 最新特性:https://github.com/dotnet/roslyn/blob/master/docs/Language%20Feature%20Status.md
- 历史特性:https://github.com/dotnet/csharplang/blob/master/Language-Version-History.md
C# Language Specification
Standard ECMA-334
- December 2002,包含C# 1.0,C# 1.1,C# 1.2。
- June 2006,包含C# 2.0。
- December 2017,C# 5.0版本,最新版本。
- 除此之外其他版本(如C# 3.0,C#4.0,C#8.0等)未收入ECMA标准。
Microsoft
Version | Date | .NET Framework | Visual Studio |
---|---|---|---|
C# 1.0 | 2002.01 | .NET Framework 1.0 | VS 2002 |
C# 1.1 C# 1.2 |
2003.10 | .NET Framework 1.1 | VS 2003 |
C# 2.0 | 2005.11 | .NET Framework 2.0 | VS 2005 |
C# 3.0 | 2007.11 | .NET Framework 2.0 .NET Framework 3.0 .NET Framework 3.5 |
VS 2008 VS 2010 |
C# 4.0 | 2010.04 | .NET Framework 4 | VS 2010 |
C# 5.0 | 2012.08 | .NET Framework 4.5 | VS 2012 VS 2013 |
C# 6.0 | 2015.07 | .NET Framework 4.6 | VS 2015 |
C# 7.0 | 2017.03 | .NET Framework 4.6.2 | VS 2017 |
C# 7.1 | 2017.08 | .NET Framework 4.7 | VS 2017 v15.3 |
C# 7.2 | 2017.11 | .NET Framework 4.7.1 | VS 2017 v15.5 |
C# 7.3 | 2018.05 | .NET Framework 4.7.2 | VS 2017 v15.7 |
C# 8.0 | 2019.10 | .NET Framework 4.8 | 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
- foreach over string specialization
C# 2.0 - Visual Studio 2005
- Generics
- Partial types
- Anonymous methods
- Iterators
- Nullable types
- Getter/setter separate accessibility
- Method group conversions (delegates)
- Static classes
- Delegate inference
C# 3.0 - Visual Studio 2008
- Implicitly typed local variables
- Object and collection initializers
- Auto-Implemented properties
- Anonymous types
- Extension methods
- Query expressions
- Lambda expression
- 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")
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
C# 6.0 - Visual Studio 2015
- Draft Specification online
- Compiler-as-a-service (Roslyn)
- Import of static type members into namespace
- Exception filters
- Await in catch/finally blocks
- Auto property initializers
- Default values for getter-only properties
- Expression-bodied members
- Null propagator (null-conditional operator, succinct null checking)
- String interpolation
- nameof operator
- Dictionary initializer
C# 7.0 - Visual Studio 2017
- Out variables
- Pattern matching
- Tuples
- Deconstruction
- Discards
- Local Functions
- Binary Literals
- Digit Separators
- Ref returns and locals
- Generalized async return types
- More expression-bodied members
- Throw expressions
C# 7.1 - Visual Studio 2017 version 15.3
- Async 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
- In parameters and readonly references
- Ref conditional
- Non-trailing named arguments
- Private protected accessibility
- Digit separator after base specifier
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