C#最新语言特性

C#最新语言特性

近几年持续引入多个新特性以提升开发效率和代码质量,截至今年2025年2月,C#的最新稳定版本是C#13,它是在2024年11月发布的,下方是一些C#13中的新特性以及近期版本特性。

C#13版本

params集合增强

params关键字得到了扩展,允许其应用任何可识别的集合类型,而不仅仅是数组,这意味着可以定义一个接受如Span<T>或实现IEnumerabel<T>的类型作为参数。

C# 复制代码
public void PrintItems(params IEnumerable<string> items)
{
    foreach (var item in items)
    {
        Console.WriteLine(item);
    }
}
新锁定对象

.NET9引入一个新的线程同步类型System.Threading.Lock,它提供了比传统Monitor更高效的同步机制。使用时可以通过Lock.EnterScope()方法进入独占范围,并通过Dispose()方法退出该范围:

C# 复制代码
using (var locker = new Lock().EnterScope())
{
    // 在此范围内执行需要同步的操作
}
新转义序列\e

新增加的转义类型\e表示Unicode中的ESCAPE字符(U+001B),这使得处理控制字符冯家直观:

C# 复制代码
string escapeSequence = "\e[31mHello, World!\e[0m"; // 使用 ANSI 转义码设置文本颜色为红色
Console.WriteLine(escapeSequence);
方法组自然类型改进

C#13改进了涉及方法组的重载解析过程,减少了不必要的转换并提高了编译器的效率。

对象初始值设定项中的隐式索引访问

现在可以在对象初始化表达式中使用隐藏的"从末尾"索引运算符^来初始化数组元素:

C# 复制代码
var numbers = new int[5]
{
    [^1] = 4,
    [^2] = 3,
    [^3] = 2,
    [^4] = 1,
    [^5] = 0
};
迭代器和async方法中的refunsafe上下文

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:
修改项目文件

如果默认设置没有自动将语言版本设置为你期望的版本,你可以手动修改项目文件(.csproj)来指定语言版本。

手动编辑 .csproj 文件:

找到项目的.csproj文件,并添加或修改<LangVersion>元素。例如,如果你想设置为C# 13,可以这样做:

C# 复制代码
<PropertyGroup>
    <LangVersion>13</LangVersion>
</PropertyGroup>

如果希望使用预览功能,可以将值设为 preview

C# 复制代码
<PropertyGroup>
    <LangVersion>preview</LangVersion>
</PropertyGroup>
配置多个项目

对于拥有多个项目的解决方案,可以在根目录下的Directory.Build.props文件中设置全局的语言版本。这会应用于该目录及其所有子目录中的项目:

C# 复制代码
<Project>
  <PropertyGroup>
    <LangVersion>13</LangVersion>
  </PropertyGroup>
</Project>
使用命令行编译器选项

当你从命令行编译代码时,也可以通过传递-langversion参数来指定语言版本。例如:

C# 复制代码
csc -langversion:13 Program.cs
检查当前语言版本

要检查当前正在使用的语言版本,可以在代码中添加如下指令:

C# 复制代码
#error version

当编译时,这将导致编译器报告错误CS8304,并显示所使用的编译器版本和当前选定的语言版本。

注意事项

  1. 确保目标框架(Target Framework Moniker, TFM)与所选的C#语言版本兼容。例如,C# 13仅在.NET 9及更高版本上受支持。
  2. 不建议将<LangVersion>设置为latest,因为这可能导致生成不可靠。

C#12版本

12版本发布与2023年11月,这版本宗旨是为提高生产力、代码的可读性和简洁性。

主构造函数

在 C# 12 中,可以在任何 classstruct 中创建主构造函数,而不再局限于 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 breaking changes - dotnet 10

csharp/whats-new/csharp-version-history

C#14

发布时间2025年2月7日

https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/breaking-changes/compiler breaking changes - dotnet 10

相关推荐
Evaporator Core5 分钟前
MATLAB在数据分析和绘图中的应用:从基础到实践
开发语言·matlab·数据分析
代码代码快快显灵10 分钟前
Redis——用户签到BitMap,UV统计
数据库·redis·缓存
瓦力的狗腿子28 分钟前
Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现
开发语言·python·算法
m0_7482347128 分钟前
Java基础进阶提升
java·开发语言
学而不思则罔~39 分钟前
Go 之 语言基本类型
开发语言·后端·golang
千年死缓40 分钟前
go实现敏感词过滤
开发语言·后端·golang
shinelord明1 小时前
【再谈设计模式】访问者模式~操作对象结构的新视角
开发语言·数据结构·算法·设计模式·软件工程
Python私教1 小时前
Flutter 实现抖音风格底部导航栏
android·开发语言·javascript
筑梦之路1 小时前
sysbench压测pgsql数据库 —— 筑梦之路
数据库·postgresql
饼干帅成渣1 小时前
c++中sleep是什么意思(不是Sleep() )
开发语言·c++