目录
- 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):解决默认接口方法中的覆盖冲突问题。