技术速递|使用 C# 13 参数集合可以更轻松、更快速地调用方法

作者:Kathleen Dollard - 首席项目经理

排版:Alan Wang

C# 13 提供的功能让您能够更轻松、更安全、更快速地以您熟悉和喜爱的风格编写代码。您可以在 C# 13 中的新增功能中找到 C# 13 功能的完整列表。

C# 13 实现了一项长期以来的功能请求,现在允许集合表达式支持的任何集合类型作为params参数,而不仅仅是数组。 此功能基于 C# 12 中引入的集合表达式功能。

使用集合表达式奠定基础

C# 12 中引入了集合表达式,为以前创建各种集合的无数种方法提供了一种替代方法。在方法上下文中,这允许您在许多场景中简化集合的使用,包括调用方法:

// C# 12 之前
WriteByteArray(new[] { (byte)1, (byte)2, (byte)3 });
WriteByteSpan(stackalloc[] { (byte)1, (byte)2, (byte)3 });
// C# 12 之后
WriteByteArray([1, 2, 3]);
WriteByteSpan([1, 2, 3]);
static void WriteByteArray(byte[] bytes) { }
static void WriteByteSpan(Span<byte> bytes) { }

这也使我们能够统一 C# 处理集合的方式。请注意,集合表达式可以推断集合的类型和成员的类型。

params 数组

params 自 C# 1.0 以来就一直存在于该语言中。它允许调用代码以逗号分隔的列表形式包含零到多个参数。该方法以数组形式接收此列表,该列表可能为空:

WriteByteArray(1, 2, 3);
WriteByteArray();
static void WriteByteArray(params byte[] bytes) { }

在 C# 13 之前,必须在方法的参数列表中将 params 声明为数组。

除了使用值列表进行调用外,您还可以使用数组调用带有 params 参数的方法。 并且从 C# 12 开始,它可以是集合表达式:

WriteByteArray(1, 2, 3);
WriteByteArray([1, 2, 3]);
byte[] bytes = [4, 5];
WriteByteArray([1, 2, 3, .. bytes]);
static void WriteByteArray(params byte[] bytes) { }

params 集合

从 C# 13 开始,params 可以是任何支持集合表达式的集合类型:

WriteByteSpan(1, 2, 3);
WriteByteSpan();
static void WriteByteSpan(params Span<byte> bytes) { }

虽然这似乎是一个很小的变化,但它通常可以让编译器优化您的代码。例如,如果该方法使用 params Span,则编译器可以使用堆栈空间为该方法创建Span。这比分配数组的性能更好。

使用特定类型还可以向调用者传达集合的使用方式。例如,params IReadonlyList表示集合不会被修改。

如果您使用 params IEnumerable,则用户可以传递文字值列表、数组、List、任何实现 IEnumerable的集合类型或 LINQ 表达式:

WriteByteArray(1, 2, 3);
byte[] bytes = [1, 2, 3, 4, 5];
WriteByteArray(bytes.Where(x => x < 4));
static void WriteByteArray(params IEnumerable<byte> bytes) { }

当 params 接收器是接口并且参数是元素的离散列表或集合表达式时,编译器将使用具体类型。许多集合接口都有一个逻辑上合理的默认实现,例如 IReadonlyList对应ReadonlyCollection。由于 IEnumerable没有如此明显的选择,并且对 .NET 至关重要,因此它对 param 和集合表达式都使用了一种特殊的高性能类型。

重载

C# 支持重载方法 - 这意味着如果参数类型不同,则可以存在多个同名方法。您可以像重载其他参数一样对 params 集合进行重载。

例如,您可能在同一个解析范围内有一个带有 params IEnumerable的重载和一个带有 params ReadOnlySpan的重载。如果您传递一个值列表,则将选择 params ReadOnlySpan重载。如果您传递一个数组,则也将选择 params ReadOnlySpan重载,因为从数组到 ReadOnlySpan存在隐式转换。如果您传递 List,则将使用 params IEnumerable 重载:

public class ParamCollections
{public static void Overloads(){WriteNumbers(1, 2, 3);WriteNumbers([1, 2, 3]);WriteNumbers(new[] { 1, 2, 3 });byte[] ints = [1, 2, 3, 4, 5];WriteNumbers(ints.Where(x => x < 4));}// 此代码从静态本地函数转变为私有函数 // 因为局部函数不允许重载。    private static void WriteNumbers<T>(params IEnumerable<T> values) => Console.WriteLine("IEnumerable");private static void WriteNumbers<T>(params ReadOnlySpan<T> values) => Console.WriteLine("Span");
}
// 结果是:
// 
// Span
// Span
// Span
// IEnumerable

编译器会为您挑选一个合理的重载。如果 Span 可用,它通常会被优先选择,因为这样可以避免在方法调用中进行内存分配。

无论您是否将 params 集合添加到您自己的代码中,它们都会使您的应用程序运行得更快,因为 .NET 运行时库现在可以在更多地方使用 Span 等高性能类型。您可以使用与 params 相同的概念,调用者在如何调用方法方面具有更大的灵活性,并且编译器将选择重载。

考虑重载

重载是 C# 的一个非常强大的功能。但与许多强大的功能一样,正确使用它非常重要。如果有多个同名的方法,它们应该执行相同的操作。它们在执行方式或性能上可能有所不同,但更改传递的类型不会给您的应用程序带来重大更改。通常,这意味着在调整参数值后调用单个实现。

如上例所示,调用代码的微小变化可能会导致调用不同的重载。对于所有 C# 应用程序来说都是如此,无论您是否使用 params 集合。

总结

我们对 C# 13 中的参数集合感到非常兴奋,迫不及待地想听听您的想法!

您可以在 C# 13 中的新增功能中了解 C# 13 中的所有功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35976.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

对于MySQL中视图的相关实验

以下用该表举例&#xff1a; /*Table structure for table employees */ DROP TABLE IF EXISTS employees; CREATE TABLE employees ( employee_id int(6) NOT NULL DEFAULT 0, first_name varchar(20) DEFAULT NULL, last_name varchar(25) NOT NULL, email varc…

day-90 使数组为空的最少操作次数

思路 统计每个数字出现的次数&#xff0c;计算每个数字的操作次数&#xff0c;将所有操作次数累加返回即可 解题过程 对于每个数字&#xff08;假设出现次数num&#xff09;,如果num等于1,返回-1&#xff1b;如果num%3等于0&#xff0c;返回num/3&#xff1b;如果num%3不等于0…

6.xftp使用教程

xftp用于windows和linux之间进行文件互传 1.先安装xftp软件&#xff0c;并双击打开 2.文件 – 新建 3.配置参数 4.连接 5.把需要的文件扯到右边

[nmap] 端口扫描工具的下载及详细安装使用过程(附有下载文件)

前言 nmap网络连接端扫描软件&#xff0c;用于主机发现、端口扫描、版本侦测、操作系统侦测 namp 链接&#xff1a;https://pan.quark.cn/s/4ea55a2d62c3 提取码&#xff1a;aXnr 下载压缩包后解压 &#xff01;&#xff01;安装路径不要有中文 链接失效&#xff08;可能被官…

详解组合模式

引言 有一种情况&#xff0c;当一组对象具有“整体—部分”关系时&#xff0c;如果我们处理其中一个对象或对象组合&#xff08;区别对待&#xff09;&#xff0c;就可能会出现牵一发而动全身的情况&#xff0c;造成代码复杂。这个时候&#xff0c;组合模式就是一种可以用一致的…

计算机网络复习——概念强化作业

物理层负责网络通信的二进制传输 用于将MAC地址解析为IP地址的协议为RARP。 一个交换机接收到一帧,其目的地址在它的MAC地址表中查不到,交换机应该向除了来的端口外的所有其它端口转发。 关于ICMP协议,下面的论述中正确的是ICMP可传送IP通信过程中出现的错误信息。 在B类网络…

SQL语法——DQL查询

1.查询: 基础查询&#xff1a; select 列名1,列名2 from 表名; # 输入列名为*时为全查 条件查询&#xff1a; select 列名 from 表名 where 条件; #条件中含字符串时为字符串

Manus手套动作捕捉AI训练灵巧手

随着人工智能&#xff08;AI&#xff09;和机器人技术的融合日益紧密&#xff0c;使用真实动作数据AI扩容训练机器人的方式正在被用于开发更富表现力的机器人。Manus手套凭借精准的动作捕捉技术和导出数据的强大兼容性&#xff0c;在灵巧手的研发和应用中发挥了重要作用。 手部…

Altium Designer学习笔记 29 PCB布线_信号线

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…

【02】复用松散型栅格切片

栅格切片分三种类型&#xff1a; 松散型、紧凑型v1紧凑型v2 见链接&#xff1a;https://blog.csdn.net/gislaozhang/article/details/144296963 说明&#xff1a;Linux环境或者Windows环境都可以参考类似的思路复用 前提条件&#xff1a;将旧服务切片服务缓存文件拷贝到新机器…

dd破坏asm磁盘头恢复---惜分飞

有朋友对asm disk的磁盘头dd了2048byte的数据 通过分析,gi软件版本,确认是11.2.0.4 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production With the Real Application Clusters and Automatic Storage Management options. ORACLE_HOME /u01/app/…

【多线程-第一天-NSThread-互斥锁和自旋锁的区别-练习-异步下载网络图片 Objective-C语言】

一、互斥锁和自旋锁的区别 1.刚刚我们看过了,互斥锁和自旋锁,下边我们来看,互斥锁和自旋锁的一个区别, 1)互斥锁:如果发现其他线程正在执行锁定代码,线程会进入休眠(就绪状态),等其他线程时间片到了,打开锁后,线程会被唤醒(执行) 它是被唤醒的,相当于什么呢,…

【vue3 for beginner】Pinia基本用法:存储user的信息

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Pinia 简介 Pinia 是一个用于 Vue.js 应用的状态管理库&#xff0c;是 Vuex 的…

PS的功能学习(钢笔+...)

钢笔工具 转换点工具&#xff0c;就是按住alt就可以转换了&#xff0c;也不用特意去工具列表里找着点 弯度钢笔工具也是比较鸡肋的&#xff0c;钢笔工具熟练之后&#xff0c;控制的也会更精确&#xff0c;弯度虽然简化了&#xff0c;但是也增加了曲线的弯度限制 其他的功能&a…

论著和教材的区别是什么?

1、内容性质 论著&#xff1a; 内容以作者的研究成果和学术观点为主。它是作者在某一学科领域进行深入研究后&#xff0c;通过实验、调查、理论推导等方式得出的创新性见解。例如&#xff0c;在生物学论著中&#xff0c;作者可能通过长期的野外观察和基因分析&#xff0c;提出…

java环境配置

后端JAVA软件的记录下载 纯粹自己懒&#xff0c;有个记录后面换电脑换公司方便 1、java的下载 oracle.com 更详细的可以看这个 JDK1.8下载、安装和环境配置教程_jdk1.8下载与安装教程_KristenX的博客-CSDN博客 2、java中变量的定义 数据类型 名称 值 /java中8中数据变量 …

03、Node.js安装及环境配置

1.下载node.js 下载地址&#xff1a;Node.js 2.安装 2.1 自定义安装路径&#xff08;可以选择默认&#xff09; 下图根据本身的需要进行&#xff0c;我选择了默认Node.js runtime&#xff0c;然后Next&#xff1a; Node.js runtime &#xff1a;表示运行环境 npm package mana…

如何突破TikTok播放量零瓶颈

TikTok已成为全球最受欢迎的短视频平台之一&#xff0c;吸引了数亿用户。然而&#xff0c;许多新手创作者在上传视频后常常面临播放量为零的困境。这种情况让人感到困惑&#xff0c;尤其是在精心制作视频内容后&#xff0c;却没有得到预期的曝光和互动。那么&#xff0c;为什么…

基于SpringBoot+Vue框架的在线考试系统的设计与实现

基于SpringBootVue框架的在线考试系统的设计与实现 系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环…

楼房销售系统设计与实现

文末获取源码和万字论文&#xff0c;制作不易&#xff0c;感谢点赞支持。 毕 业 设 计&#xff08;论 文&#xff09; 题目&#xff1a;楼房销售系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xf…