C#最新语言特性

news/2025/2/25 4:48:24

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方法中的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:
  • 可以通过访问 .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,并显示所使用的编译器版本和当前选定的语言版本。

注意事项

  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%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


http://www.niftyadmin.cn/n/5864976.html

相关文章

中间件专栏之redis篇——redis基本原理、概念及其相关命令介绍

一、redis是什么 redis是remote dictionary service的简称&#xff0c;中文翻译为远程字典服务&#xff1b; redis是一种数据库&#xff0c;若按照类型来归类&#xff0c;则其可以被归入三个类型数据库&#xff0c;分别为&#xff1a;内存数据库、KV数据库、数据结构数据库&a…

8.日常英语笔记

ribs 排骨 he broke a few ribs in the accident we had barbecued ribs for dinner 我们晚餐吃了排骨烤排骨 肋条&#xff0c;辐条 The ribs of the umbrella are made of metal pan 平底锅 I used a pan to fry the eggs 烤盘 Put the cake pan in the oven 把蛋糕烤盘放到烤…

C#初级教程(4)——流程控制:从基础到实践

1.为什么需要流程控制 有时候&#xff0c;需要根据程序运行时的具体环境&#xff0c;有选择地执行不同代码段&#xff1b;而有时候&#xff0c;则需要反复执行同一段代码。这时候&#xff0c;流程控制中的分支和循环就发挥了关键作用。分支能让代码根据条件判断结果来决定执行路…

欢乐力扣:同构字符串

文章目录 1、题目描述2、 代码 1、题目描述 同构字符串。给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。  每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符…

【深度学习】Adam和AdamW优化器有什么区别,以及为什么Adam会被自适应学习率影响

Adam 和 AdamW 的主要区别在于 权重衰减&#xff08;Weight Decay&#xff09; 的实现方式&#xff0c;具体如下&#xff1a; 1. 权重衰减&#xff08;Weight Decay&#xff09;处理方式 Adam&#xff1a;采用 L2 正则化&#xff0c;通过在梯度更新时手动添加 weight_decay 项…

Ollama Open WebUI

Open WebUI 用户友好的 AI 界面&#xff08;支持 Ollama、OpenAI API 等&#xff09;。 Open WebUI 支持多种语言模型运行器&#xff08;如 Ollama 和 OpenAI 兼容 API&#xff09;&#xff0c;并内置了用于检索增强生成&#xff08;RAG&#xff09;的推理引擎&#xff0c;使其…

JPA与存储过程的完美结合

在现代的Java开发中&#xff0c;JPA&#xff08;Java Persistence API&#xff09;已经成为ORM&#xff08;对象关系映射&#xff09;的主流选择之一。它不仅简化了数据库操作&#xff0c;还提供了强大的功能来与数据库交互。今天&#xff0c;我们将深入探讨如何通过NamedStore…

安全见闻5

今天学了Windows操作系统和驱动程序的相关知识 Windows注册表 注册表是windows系统中具有层次结构的核心数据库 储存的数据对windows 和Windows上运行的应用程序和服务至关重要。注册表时帮助windows控制硬件、软件、用户环境和windows界面的一套数据文件。 打开注册表编辑器…