C# 13新特性 - .NET 9
转载: C# 13 中的新增功能 | Microsoft Learn
C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能:Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13+
C# 13 中的新增功能 | Microsoft Learn
- params 集合
- 新的 lock 类型和语义。
- 新的转义序列 - \e。
- 方法组自然类型改进
- 对象初始值设定项中的隐式索引器访问
- 在迭代器和异步方法中启用 ref 局部变量和 unsafe 上下文
- 启用 ref struct 类型来实现接口。
- 允许在泛型中将 ref 结构类型 作为类型参数的参数。
partial类型中现在允许使用部分属性和索引器。- 重载解析优先级允许库作者指定一种重载优于其他重载。
params 集合
params修饰符并不局限于数组类型,现在可以将params用于任何以识别的集合类型,包括System.Span<T>、System.ReadOnlySpan<T>,以及那些实现 System.Collections.Generic.IEnumerable<T> 并具有 Add 方法的类型。
除了具体类型外,还可以使用接口 System.Collections.Generic.IEnumerable<T>、System.Collections.Generic.IReadOnlyCollection<T>、System.Collections.Generic.IReadOnlyList<T>、System.Collections.Generic.ICollection<T>和 System.Collections.Generic.IList<T>。
使用接口类型时,编译器会为所提供的参数合成存储。 可以在 params 集合的功能规范中了解更多信息。
public void Concat<T>(params ReadOnlySpan<T> items)
{for (int i = 0; i < items.Length; i++){Console.Write(items[i]);Console.Write(" ");}Console.WriteLine();
}
新锁定对象
.NET 9 运行时包含一种新的线程同步类型,即 System.Threading.Lock 类型。 该类型通过其 API 提供更好的线程同步。 Lock.EnterScope() 方法进入独占范围。 从中返回的 ref struct 支持退出独占范围的 Dispose() 模式。
C# lock 语句可识别锁定的目标是否为 Lock 对象。 如果是,则使用更新的 API,而不是使用 System.Threading.Monitor 的传统 API。 如果将 Lock 对象转换为另一种类型,编译器也会识别,并生成基于 Monitor 的代码。 可以在新锁定对象的功能规范中了解详细信息。
通过此功能,您可以通过更改对象 lock的类型来获得新库类型的优势。 其他代码无需更改。
新的转义序列
你可以使用 \e 作为 ESCAPE 字符 Unicode U+001B 的字符文本转义序列。 以前,你使用的是 \u001b 或 \x1b。 不建议使用 \x1b,因为如果 1b 后面的下一个字符是有效的十六进制数字,则那些字符会成为转义序列的一部分。
方法组自然类型
此功能对涉及方法组的重载解析进行了少量优化。 方法组是一个方法,并且所有重载都具有相同的名称。 编译器以前的行为是为方法组构造完整的候选方法集。 如果需要自然类型,则自然类型是根据整套候选方法确定的。
新行为是在每个作用域内削减候选方法集,移除那些不适用的候选方法。 通常,被删除的方法是具有错误参数或不满足约束的泛型方法。 只有在没有找到候选方法的情况下,该过程才会继续到下一个外部作用域。 此过程更紧密地遵循重载决策的一般算法。 如果在给定作用域内找到的所有候选方法都不匹配,则该方法组没有自然类型。
您可以在 提案规范中查看更改的详细信息。
隐式索引访问
现在在对象初始化表达式中允许使用隐式“从末尾”索引运算符^。 例如,你现在可以在对象初始值设定项中初始化数组,如以下代码所示:
public class TimerRemaining
{public int[] buffer { get; set; } = new int[10];
}var countdown = new TimerRemaining()
{buffer ={[^1] = 0,[^2] = 1,[^3] = 2,[^4] = 3,[^5] = 4,[^6] = 5,[^7] = 6,[^8] = 7,[^9] = 8,[^10] = 9}
};
TimerRemaining 类包括一个 buffer 数组,其初始化长度为 10。 前面的示例使用“从末尾”索引操作符 (^) 为数组赋值,从而有效地创建了一个从 9 开始倒数到 0 的数组。
在 C# 13 之前的版本中,对象初始化器中不能使用 ^ 运算符。 你需要从前面开始为元素编制索引。
迭代器和 async 方法中的 ref和 unsafe
该功能和以下两个功能使 ref struct 类型可以使用新的结构体。 除非你编写自己的 ref struct 类型,否则你不会使用这些类型。 你更可能会看到间接的好处,因为 System.Span<T> 和 System.ReadOnlySpan<T> 获得了更多的功能。
在 C# 13 之前,迭代器方法(使用 yield return 的方法)和 async 方法不能声明局部 ref 变量,也不能使用 unsafe 上下文。
在 C# 13 中,async 方法可以声明 ref 局部变量或 ref struct 类型的局部变量。 但是,无法跨 await 边界访问这些变量。 也不能跨越 yield return 边界访问它们。
这种放宽的限制使编译器可以在更多地方安全地使用 ref 本地变量和 ref struct 类型,并可验证其安全性。 可以在这些方法中安全地使用 System.ReadOnlySpan<T> 等类型。 如果违反了安全规则,编译器会告诉你。
同样,C# 13 允许在迭代器方法中使用 unsafe 上下文。 但是,所有 yield return 和 yield break 语句都必须在安全的上下文中。
allows ref struct
在 C# 13 之前,ref struct 类型不能声明为泛型或方法的类型参数。 现在,泛型类型声明可以添加反约束 allows ref struct。 此反约束声明为该类型参数提供的类型参数可以是 ref struct 类型。 编译器会对该类型参数的所有实例执行 ref 安全规则。
例如,可以像下面的代码一样声明一个泛型类型:
public class C<T> where T : allows ref struct
{// Use T as a ref struct:public void M(scoped T p){// The parameter p must follow ref safety rules}
}
这样,System.Span<T> 和 System.ReadOnlySpan<T> 等类型就可以与泛型算法一起使用(如果适用)。 可以在 where 的更新以及有关泛型约束的编程指南文章中了解详细信息。
ref struct 接口
在 C# 13 之前,ref struct 类型不允许实现接口。 从 C# 13 开始,这些功能可以实现。 你可以声明 ref struct 类型实现某个接口。 但是,为了确保 ref 安全规则,ref struct 类型无法转换为接口类型。 这种转换是装箱转换,可能会违反 ref 安全性。 ref struct 中的显式接口方法声明只能通过类型参数访问,而该类型参数为 allows ref struct。 此外,ref struct 类型必须实现接口中声明的所有方法,包括默认实现的方法。
有关 ref struct 类型 和新增 allows ref struct 泛型约束的更多信息,请参阅更新。
更多部分成员
可以在 C# 13 中声明 partial 属性和 partial 索引器。 部分属性和索引器通常遵循与 partial 方法相同的规则:创建一个 声明声明,一个实现声明。 这两种声明的签名必须匹配。 一个限制是,不能使用自动属性声明来实现部分属性。 未声明正文的属性被视为声明声明。
public partial class C
{// Declaring declarationpublic partial string Name { get; set; }
}public partial class C
{// implementation declaration:private string _name;public partial string Name{get => _name;set => _name = value;}
}
重载解析优先级
在 C# 13 中,编译器识别 OverloadResolutionPriorityAttribute,以便优先选择一个重载而不是另一个。 库作者可以使用该属性确保新的、更好的重载比现有的重载更受青睐。 例如,可以添加性能更高的新重载。 你不想中断使用库的现有代码,但又希望用户在重新编译时更新到新版本。 可以使用 重载解析优先级 来指示编译器应该优先选择哪个重载。 优先考虑优先级最高的超载。
此功能的目的是让库作者在添加新的重载时避免出现歧义。 库作者应谨慎使用该属性,以避免混淆。
field 关键字
field 上下文关键字在 C# 13 中作为预览特性提供。 令牌 field 访问属性访问器中的编译器合成支持字段。 它使你可以编写访问器的主体,而无需在类型声明中显式声明备份字段。 可以为字段支持的属性的一个或两个访问器声明一个主体。
field 功能作为预览功能发布。 我们希望从你的使用经验中学习。 如果类型中还包含一个名为 field 的字段,则在读取代码时可能会出现重大更改或混淆。 可以使用 @field 或 this.field 来消除 field 关键字和标识符之间的歧义。
重要
field关键字是 C# 13 中的一项预览功能。 必须使用 .NET 9,并在项目文件中将<LangVersion>元素设置为preview,才能使用field上下文关键字。在有名为
field的字段的类中使用field关键字功能时应小心谨慎。 新的field关键字在属性访问器的范围内隐藏一个名为field的字段。 可以更改field变量的名称,或者使用@令牌将field标识引用为@field。 可以通过阅读 field关键字的功能规范来了解详细信息。
另请参阅
- .NET 9 的新增功能
相关文章:
C# 13新特性 - .NET 9
转载: C# 13 中的新增功能 | Microsoft Learn C# 13 包括以下新增功能。 可以使用最新的 Visual Studio 2022 版本或 .NET 9 SDK 尝试这些功能:Introduced in Visual Studio 2022 Version 17.12 and newer when using C# 13 C# 13 中的新增功能 | Micr…...
【Code】《代码整洁之道》笔记-Chapter9-单元测试
第9章 单元测试 过去十年以来,编程专业领域进步很大。1997年时,没人听说过测试驱动开发。对于我们之中的大多数人来说,单元测试是那种用来确保程序“可运行”的用过即扔的短代码。我们辛勤地编写类和方法,再弄出一些特殊代码来测…...
java -jar 如何持久化运行
在 Linux 中,直接通过 java -jar 启动服务后关闭 SSH 客户端(如 Xshell)会导致服务终止,因为进程默认与当前终端会话绑定。以下是几种解决方案,确保服务在后台持久运行: (1)使用nohup命令,让进程忽略挂断信号,并在后台运行。 ps -ef | grep xxx.jar 或者 ps -ef …...
layui中transfer两个table展示不同的数据列
在项目的任务开发中需要达到transfer右侧table需要有下拉框可选择状态,左侧table不变 使用的layui版本为2.4.5,该版本没有对transfer可自定义数据列的配置,所以改动transfer.js中的源码 以下为transfer.js部分源码 也是transfer.js去render的…...
如何通过Radius认证服务器实现虚拟云桌面安全登录认证:安当ASP身份认证系统解决方案
引言:虚拟化时代的安全挑战 随着云计算和远程办公的普及,虚拟云桌面(如VMware Horizon、Citrix)已成为企业数字化办公的核心基础设施。然而,传统的用户名密码认证方式暴露了诸多安全隐患:弱密码易被暴力破…...
如何用DeepSeek大模型提升MySQL DBA工作效率?实战案例解析
如何用DeepSeek大模型提升MySQL DBA工作效率?实战案例解析 MySQL DBA(数据库管理员)的工作涉及数据库监控、SQL优化、故障排查、备份恢复等复杂任务,传统方式依赖手动操作和经验判断,效率较低。而DeepSeek大模型可以结…...
【机器学习】机器学习笔记
1 机器学习定义 计算机程序从经验E中学习,解决某一任务T,进行某一性能P,通过P测定在T上的表现因经验E而提高。 eg:跳棋程序 E: 程序自身下的上万盘棋局 T: 下跳棋 P: 与新对手下跳棋时赢的概率…...
CFD中的动量方程非守恒形式详解
在计算流体力学(CFD)中,动量方程可以写成守恒形式和非守恒形式,两者在数学上等价,但推导方式和应用场景不同。以下是对非守恒形式的详细解释: 1. 动量方程的守恒形式 首先回顾守恒形式的动量方程ÿ…...
如何在本地修改 Git 项目的远程仓库地址
✅ 场景说明 你当前的 Git 项目地址是: http://192.168.0.16/xxx.git你希望把它改成: http://192.168.0.22:8099/xxx.git🧩 操作步骤 步骤 ①:进入项目所在目录 你已经在正确路径下了: cd C:\Develop\xxx确认这个…...
clickhouse中的窗口函数
窗口函数 边界核心参数 窗口边界通过 ROWS、RANGE 或 GROUPS 模式定义,语法为: ROWS BETWEEN AND 基于 物理行位置 定义窗口,与排序键的实际值无关,适用于精确控制窗口行数 – 或 RANGE BETWEEN AND 基于 排序键的数值范围 定义窗口,适用于时间序列或连续数值的场景(…...
如何从项目目标到成功标准:构建可量化、可落地的项目评估体系
引言 在项目管理领域,"项目成功"的定义往往比表面看起来更复杂。根据PMI的行业报告,67%的项目失败源于目标与成功标准的不匹配。当项目团队仅关注"按时交付"或"预算达标"时,常会忽视真正的价值创造。本文将通…...
fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb
fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb fbx/obj/glb/gltf/b3dm等通用格式批量转换成osgb...
STM32 BOOT设置,bootloader,死锁使用方法
目录 BOOT0 BOOT1的配置含义 bootloader使用方法 芯片死锁解决方法开发调试过程中,由于某种原因导致内部Flash锁死,无法连接SWD以及JTAG调试,无法读到设备,可以通过修改BOOT模式重新刷写代码。修改为BOOT01,BOOT10…...
vue2 设置ant-table和el-table隔行变色
vue2 设置ant-table和el-table隔行变色 ant-table /* 奇数行 */ ::v-deep .ant-table-tbody > tr:nth-child(odd) {background-color: transparent; } /* 偶数行 */ ::v-deep .ant-table-tbody > tr:nth-child(even) {background-color: rgba(15, 166, 255, 0.26); }el…...
【Redis】string类型
目录 1、介绍2、底层实现【1】SDS【2】int编码【3】embstr编码【4】raw编码【5】embstr和raw的区别 3、常用指令【1】字符串基本操作:【2】批量操作【3】计数器【4】过期时间【5】不存在就插入 4、使用场景 1、介绍 string是redis中最简单的键值对形式,…...
《解锁分布式软总线:构建智能设备统一管理平台》
智能设备的数量呈爆发式增长,从智能家居里的各类电器,到智能办公中的电脑、打印机,再到工业领域的各种自动化设备,不一而足。如何对这些纷繁复杂的智能设备进行有效管理,成为摆在我们面前的一道难题。分布式软总线技术…...
PostgreSQL全平台安装指南:从入门到生产环境部署
一、PostgreSQL核心特性全景解析 1.1 技术架构深度剖析 graph TDA[客户端] --> B(连接池)B --> C{查询解析器}C --> D[优化器]D --> E[执行引擎]E --> F[存储引擎]F --> G[物理存储]G --> H[WAL日志]H --> I[备份恢复] 1.2 特性优势对比矩阵 特性维度…...
UE5 物理模拟 与 触发检测
文章目录 碰撞条件开启模拟关闭模拟 多层级的MeshUE的BUG 触发触发条件 碰撞 条件 1必须有网格体组件 2网格体组件必须有网格,没有网格虽然可以开启物理模拟,但是不会有任何效果 注意开启的模拟的网格体组件会计算自己和所有子网格的mesh范围 3只有网格…...
做仪器UI用到的颜色工具网站
https://color.adobe.com/zh/create/color-wheel 1. 图片取颜色工具 2. 对比度工具,煤矿井下设备,光线暗,要求背景与文字有合适的对比度,可以用这个软件 3. 颜色生成ARGB的值工具,这三个工具,都在上面这…...
【算法】【蓝桥23国A软件C】四版代码思路分析与逐步优化
题目来源:第十四届蓝桥杯大赛软件赛国赛C/C 大学 A 组 题目描述: 问题描述 给定一个 WH 的长方形,两边长度均为整数。小蓝想把它切割为很多个边长为整数的小正方形。假设切割没有任何损耗,正方形的边长至少为 2,不允…...
网络安全·第三天·ICMP协议安全分析
一、ICMP功能介绍 ICMP(Internet Control Message Protocal)是一种差错和控制报文协议,不仅用于传输差错报文, 还传输控制报文,但是ICMP只是尽可能交付,提供的服务是无连接、不可靠的,并不能保…...
SpringBoot对接火山引擎大模型api实现图片识别与分析
文章目录 一、前言二、创建应用三、后端1.SDK集成2.调用Rest API 四、前端 一、前言 Spring AI实战初体验——实现可切换模型AI聊天助手-CSDN博客 如上,在上一篇博客,我们已经实现了spring ai对接本地大模型实现了聊天机器人,但是目前有个新…...
单片机方案开发 代写程序/烧录芯片 九齐/应广等 电动玩具 小家电 语音开发
在电子产品设计中,单片机(MCU)无疑是最重要的组成部分之一。无论是消费电子、智能家居、工业控制,还是可穿戴设备,小家电等,单片机的应用无处不在。 单片机,简而言之,就是将计算机…...
Open Interpreter:重新定义人机交互的开源革命
引言 在人工智能技术蓬勃发展的今天,人机交互的方式正经历着前所未有的变革。Open Interpreter,作为一个开源项目,正在重新定义我们与计算机的互动方式。它允许大型语言模型(LLMs)在本地运行代码,通过自然…...
解决前端使用Axios时的跨域问题
跨域问题是前端开发中常见的问题,当你的前端应用尝试访问不同域名、端口或协议的API时就会出现。以下是几种解决方案: 1. 后端解决方案 CORS (推荐) 后端需要设置正确的响应头: Access-Control-Allow-Origin: * // 或指定具体域名 Acces…...
ARCGIS PRO 在已建工程地图中添加在线地图
一、手工添加 如图所示: 1、在上方的菜单栏中点击“插入”,选择“连接” 2、新建ArcGIS Server 3、在弹出框中输入在线图集的URL,点击“确定” https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer 4、查看在…...
ScholarCopilot:“学术副驾驶“
这里写目录标题 引言:学术写作的痛点与 AI 的曙光ScholarCopilot 的核心武器库:智能生成与精准引用智能文本生成:不止于“下一句”智能引用管理:让引用恰到好处 揭秘背后机制:检索与生成的动态协同快速上手:…...
MATLAB仿真多相滤波抽取与插值的频谱变化(可视化混叠和镜像)
MATLAB画图仿真多相滤波抽取与插值的频谱变化 可视化多速率信号处理抽取与插值的频谱变化 实信号/复信号 可视化混叠和镜像 目录 前言 一、抽取的基本原理 二、MATLAB仿真抽取运算 三、内插的基本原理 四、MATLAB仿真内插运算 总结 前言 在多速率系统中增加信号采样率的运…...
mongodb 远程访问
mongodb 远程访问 MongoDB 数据库的远程访问通常需要一些配置步骤,以确保安全性并正确设置网络访问权限。以下是一些基本步骤来允许远程访问 MongoDB 数据库: 修改 MongoDB 配置文件 首先,你需要编辑 MongoDB 的配置文件(通常是 …...
DAY 44 leetcode 28--字符串.实现strStr()
题号28 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。 我的解法 双指针,slow定位&…...
