C#最新语言特性
近几年持续引入多个新特性以提升开发效率和代码质量,截至今年2025年2月,C#的最新稳定版本是C#13,它是在2024年11月发布的,下方是一些C#13中的新特性以及近期版本特性。
C#13版本
params集合增强
params关键字得到了扩展,允许其应用任何可识别的集合类型,而不仅仅是数组,这意味着可以定义一个接受如Span<T>
或实现IEnumerabel<T>
的类型作为参数。
public void PrintItems(params IEnumerable<string> items)
{foreach (var item in items){Console.WriteLine(item);}
}
新锁定对象
.NET9引入一个新的线程同步类型System.Threading.Lock
,它提供了比传统Monitor更高效的同步机制。使用时可以通过Lock.EnterScope()
方法进入独占范围,并通过Dispose()
方法退出该范围:
using (var locker = new Lock().EnterScope())
{// 在此范围内执行需要同步的操作
}
新转义序列\e
新增加的转义类型\e
表示Unicode中的ESCAPE字符(U+001B),这使得处理控制字符冯家直观:
string escapeSequence = "\e[31mHello, World!\e[0m"; // 使用 ANSI 转义码设置文本颜色为红色
Console.WriteLine(escapeSequence);
方法组自然类型改进
C#13改进了涉及方法组的重载解析过程,减少了不必要的转换并提高了编译器的效率。
对象初始值设定项中的隐式索引访问
现在可以在对象初始化表达式中使用隐藏的“从末尾”索引运算符^
来初始化数组元素:
var numbers = new int[5]
{[^1] = 4,[^2] = 3,[^3] = 2,[^4] = 1,[^5] = 0
};
迭代器和async
方法中的ref
和unsafe
上下文
C#13支持在迭代器方法和异步方法中使用ref
布局变量以及unsafe
上下文,着对于直接内春操作非常有用。
允许ref struct
类型实现接口
现在ref struct
类型可以实现接口,从而增加他们的灵活性。
部分类中允许部分属性和索引器
C#13允许在部分类中定义部分属性和索引器,有卒于更好地组织代码。
为了引用这些新特性,需要确保你的项目配置文件(.csproj)设置了正确的语言版本(preview)或(13),并且安装了至此13的最新版.NET SDK和Visual Studio 2022。
C#13安装及引用
更新开发工具
首先,你需要确保你的开发工具支持你想要使用的C#语言版本。例如,如果你希望使用C# 13的新特性,你需要安装Visual Studio 2022的最新版本或.NET 9 SDK。
安装或更新 Visual Studio:
- 访问Visual Studio官网下载并安装最新版的Visual Studio。
- 在安装过程中选择包含C#和.NET桌面开发的工作负载。
安装或更新 .NET SDK:
- 可以通过访问 .NET下载页面 来获取最新的.NET SDK版本。
修改项目文件
如果默认设置没有自动将语言版本设置为你期望的版本,你可以手动修改项目文件(.csproj
)来指定语言版本。
手动编辑 .csproj
文件:
找到项目的.csproj
文件,并添加或修改<LangVersion>
元素。例如,如果你想设置为C# 13,可以这样做:
<PropertyGroup><LangVersion>13</LangVersion>
</PropertyGroup>
如果希望使用预览功能,可以将值设为 preview
:
<PropertyGroup><LangVersion>preview</LangVersion>
</PropertyGroup>
配置多个项目
对于拥有多个项目的解决方案,可以在根目录下的Directory.Build.props
文件中设置全局的语言版本。这会应用于该目录及其所有子目录中的项目:
<Project><PropertyGroup><LangVersion>13</LangVersion></PropertyGroup>
</Project>
使用命令行编译器选项
当你从命令行编译代码时,也可以通过传递-langversion
参数来指定语言版本。例如:
csc -langversion:13 Program.cs
检查当前语言版本
要检查当前正在使用的语言版本,可以在代码中添加如下指令:
#error version
当编译时,这将导致编译器报告错误CS8304,并显示所使用的编译器版本和当前选定的语言版本。
注意事项
- 确保目标框架(Target Framework Moniker, TFM)与所选的C#语言版本兼容。例如,C# 13仅在.NET 9及更高版本上受支持。
- 不建议将
<LangVersion>
设置为latest
,因为这可能导致生成不可靠。
C#12版本
12版本发布与2023年11月,这版本宗旨是为提高生产力、代码的可读性和简洁性。
主构造函数
在 C# 12 中,可以在任何 class
和 struct
中创建主构造函数,而不再局限于 record
类型。这意味着你可以在类声明中直接定义构造函数参数,并在整个类体范围内使用这些参数。
集合表达式
新增了一种简洁的语法用于创建数组、列表和其他集合类型。你可以使用展开运算符(…)来内联其他集合到新的集合表达式中。
内联数组
开发者现在可以利用内联数组在结构体中创建固定大小的数组,以提高性能。这对于需要高效内存管理的应用程序尤其有用。
Lambda 表达式的默认值
现在可以为 Lambda 表达式的参数指定默认值,这使得 Lambda 表达式的使用更加灵活和强大。
ref readonly
参数
这个功能允许方法接收只读引用作为参数,增加了对只读引用的支持,使 API 更加清晰 。
使用 using 指令起别名
在 C# 12 中,using 指令支持扩展到了任何类型,不仅仅是命名类型。例如,你可以为元组类型、数组类型等创建语义别名。
实验属性
提供一种标记可能不稳定的新功能的方法,帮助开发者识别和测试预览中的语言特性。
拦截器
这是一种预览功能,允许在对象生命周期的不同阶段插入自定义逻辑。
列表模式匹配
C# 12 扩展了模式匹配的功能,特别是对于数组和集合的匹配,支持捕获部分元素以及剩余部分。
C#版本历史记录
https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
C#14
发布时间2025年2月7日
https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/breaking-changes/compiler%20breaking%20changes%20-%20dotnet%2010
csharp/whats-new/csharp-version-history
C#14
发布时间2025年2月7日
https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/breaking-changes/compiler%20breaking%20changes%20-%20dotnet%2010