C#各版本特性
C# 1.0(2002年)
- 基础语法:类、结构体、接口、委托、事件、属性。
- 基本类型:
int、string、bool等。 - 异常处理:
try-catch-finally。 - 垃圾回收(GC)机制。
C# 2.0(2005年)
- 泛型:支持类型安全的集合(如
List<T>)。 - 匿名方法:通过
delegate关键字简化委托。 - 可空类型:
Nullable<T>或T?语法。 - 迭代器:
yield return简化枚举器实现。 - 部分类:
partial关键字分割类定义。
C# 3.0(2007年)
- LINQ:语言集成查询(
from-where-select语法)。 - 匿名类型:
var x = new { Name = "A" }。 - Lambda表达式:
x => x * x替代匿名方法。 - 扩展方法:通过
this修饰静态方法扩展类型。 - 自动属性:简化属性声明(
public int X { get; set; })。
C# 4.0(2010年)
- 动态类型:
dynamic关键字支持运行时类型解析。 - 命名参数与可选参数:方法调用更灵活。
- 协变与逆变:泛型接口支持
out(协变)和in(逆变)。 - COM互操作改进:简化Office等组件调用。
C# 5.0(2012年)
- 异步编程:
async/await简化异步代码。 - Caller信息特性:
[CallerMemberName]自动获取调用上下文。
C# 6.0(2015年)
- Null条件运算符:
?.避免空引用异常。 - 字符串插值:
$"{name} is {age}"替代string.Format。 - 表达式体成员:
public int X => x * 2;简化单行方法。 nameof运算符:编译时获取变量名。- 静态导入:
using static System.Math直接调用静态方法。
C# 7.0(2017年)
- 元组与解构:
(int x, int y) = GetPoint()。 - 模式匹配:
is表达式和switch模式匹配。 - 局部函数:方法内定义嵌套函数。
out变量内联声明:if (int.TryParse(s, out var x))。- 二进制字面量:
0b1010。
C# 8.0(2019年)
- 可空引用类型:显式区分可空与非空引用。
- 异步流:
IAsyncEnumerable<T>支持await foreach。 - 范围和索引:
array[1..^1]切片操作。 - 默认接口方法:接口可包含实现。
using声明:隐式作用域简化资源管理。
C# 9.0(2020年)
- 记录类型:
record关键字定义不可变数据模型。 - 顶级语句:简化控制台程序入口代码。
- 模式匹配增强:
and、or、not逻辑组合。 - 目标类型
new表达式:Point p = new(1, 2)。
C# 10.0(2021年)
- 全局
using指令:全局导入命名空间。 - 文件级命名空间:减少嵌套代码。
- 记录结构:
record struct定义值类型记录。 - 插值字符串优化:性能提升。
C# 11.0(2022年)
- 原始字符串字面量:
"""..."""保留格式文本。 - 泛型数学支持:
INumber<T>接口统一数值运算。 - 必需成员:
required修饰符强制初始化属性。 - 模式匹配改进:列表模式匹配(
[1, 2, ..])。
C# 12.0(2023年)
- 主构造函数:类声明中直接定义构造函数参数。
- 集合表达式:
List<int> x = [1, 2, 3];。 - 别名任意类型:
using Point = (int x, int y);。 - 默认Lambda参数:
Func<int> f = (x = 42) => x;。
每个版本均基于.NET运行时更新,部分特性需对应.NET版本支持。
C# 版本特性与 Unity 对应关系
Unity 引擎使用的 C# 版本受限于其内置的 Mono 或 IL2CPP 运行时版本。以下是各版本 C# 的主要特性及其支持的 Unity 版本:
C# 4.0(Unity 5.x 及更早版本)
- 特性:动态类型(
dynamic)、命名参数、可选参数、泛型协变/逆变。 - Unity 支持:Unity 5.x 及更早版本默认使用 C# 4.0。
C# 5.0(Unity 2017.x 开始部分支持)
- 特性:异步编程(
async/await)、调用方信息特性(CallerMemberName)。 - Unity 支持:Unity 2017.x 开始支持部分特性(如
async/await),但需手动配置编译器。
C# 6.0(Unity 2018.1+ 实验性支持,2018.3+ 正式支持)
- 特性:
- 空值条件运算符(
?.、?[])。 - 字符串插值(
$"Hello {name}")。 nameof表达式。- 表达式体成员(
=>)。 - 静态
using声明。
- 空值条件运算符(
- Unity 支持:Unity 2018.1 开始实验性支持,2018.3 后默认启用。
C# 7.0(Unity 2018.3+ 部分支持)
- 特性:
- 元组和析构(
(int x, int y))。 - 模式匹配(
is表达式)。 out变量直接声明(TryParse(input, out var result))。
- 元组和析构(
- Unity 支持:Unity 2018.3 后部分支持,需使用
.NET 4.x运行时。
C# 7.3(Unity 2019.2+ 默认支持)
- 特性:
- 改进的泛型约束。
==和!=支持元组比较。fixed字段无需初始化。
- Unity 支持:Unity 2019.2 后默认支持,需选择
.NET 4.x运行时。
C# 8.0(Unity 2020.1+ 部分支持)
- 特性:
- 可为空引用类型(需手动启用)。
- 异步流(
IAsyncEnumerable)。 - 范围和索引(
^、..)。 switch表达式。
- Unity 支持:Unity 2020.1 开始部分支持,需使用
.NET Core 3.x或.NET 5(实验性)。
C# 9.0(Unity 2021.2+ 部分支持)
- 特性:
- 记录类型(
record)。 - 顶级语句。
- 模式匹配增强。
- 记录类型(
- Unity 支持:Unity 2021.2 开始部分支持,需使用
.NET 5或更高版本(实验性)。
C# 10.0(Unity 2022.2+ 实验性支持)
- 特性:
- 全局
using指令。 - 文件范围的命名空间。
- 记录结构(
record struct)。
- 全局
- Unity 支持:Unity 2022.2 开始实验性支持,需使用
.NET 6。
配置 Unity 使用更高版本 C#
修改 API 兼容级别:
Project Settings > Player > Configuration > Api Compatibility Level选择.NET 4.x或.NET Standard 2.1。启用实验性功能:
在 Unity 2020+ 中,可通过Project Settings > Player > Configuration > Scripting Runtime Version选择.NET Core或.NET 5+。手动编辑项目文件:
编辑.csproj文件,添加<LangVersion>latest</LangVersion>以启用最新语言特性(需编译器支持)。
注意事项
- Unity 对 C# 新特性的支持通常滞后于官方发布。
- IL2CPP 可能不支持某些反射或动态特性。
- 生产环境中建议测试特性兼容性,尤其是跨平台项目。
