news 2026/7/7 14:28:45

C# Params Collections 详解:比 params T[] 更强大的新语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# Params Collections 详解:比 params T[] 更强大的新语法

简介

Params CollectionsC# 12中引入的新特性,它扩展了传统的params关键字功能,使其不仅支持数组,还能支持各种集合类型。这个特性使得方法能够接受可变数量的参数,并且这些参数可以自动转换为指定的集合类型。

关键特点:

  • 可变参数:调用者可以传递任意数量的参数(包括零个)。

  • 类型安全:params参数是强类型的,编译器确保参数类型匹配。

  • 单一params参数:一个方法只能有一个params参数,且必须是最后一个参数。

  • C# 12扩展:支持非数组集合类型(如List<T>,Span<T>),适合高性能或特定场景。

核心特性

支持任意集合类型
  • 可指定List<T>、Span<T>、IReadOnlyCollection<T>等作为参数类型
publicvoidLogEntries(paramsList<string>messages){...}
自动集合构造
  • 编译器自动将离散参数转换为目标集合类型实例
AnalyzeNumbers(10,20,30);// 等效于:AnalyzeNumbers(newList<int>{10,20,30});
与现有 params 兼容
  • 传统params T[]仍然有效

  • 新语法不会破坏已有代码

传统 params 关键字

C# 12之前,params关键字只能用于数组:

// 传统的 params 数组用法publicvoidProcessNumbers(paramsint[]numbers){foreach(varnumberinnumbers){Console.WriteLine(number);}}// 调用方式ProcessNumbers(1,2,3,4,5);

Params Collections 的新特性

C# 12扩展了params关键字,使其能够用于任何集合类型,只要该类型满足特定条件。

基本语法
// 使用 params 与集合类型publicvoidProcessNumbers(paramsList<int>numbers){foreach(varnumberinnumbers){Console.WriteLine(number);}}// 调用方式不变ProcessNumbers(1,2,3,4,5);

支持的条件

要使集合类型能够与params关键字一起使用,必须满足以下条件之一:

  • 集合类型必须有一个无参数的构造函数

  • 集合类型必须有一个Add方法,用于添加元素

  • 集合类型必须实现IEnumerable<T>

自定义集合与 params
// 自定义集合类publicclassNumberCollection:IEnumerable<int>{privatereadonlyList<int>_numbers=new();publicvoidAdd(intnumber)=>_numbers.Add(number);publicIEnumerator<int>GetEnumerator()=>_numbers.GetEnumerator();IEnumeratorIEnumerable.GetEnumerator()=>GetEnumerator();}// 使用自定义集合作为 params 参数publicvoidProcessNumbers(paramsNumberCollectionnumbers){foreach(varnumberinnumbers){Console.WriteLine(number);}}// 调用ProcessNumbers(1,2,3,4,5);

实际应用示例

与 Span 和 ReadOnlySpan 结合使用
// 使用 Span 作为 params 参数publicvoidProcessData(paramsSpan<int>data){for(inti=0;i<data.Length;i++){data[i]*=2;}}// 调用int[]array=[1,2,3,4,5];ProcessData(array);Console.WriteLine(string.Join(", ",array));// 输出: 2, 4, 6, 8, 10
与 Immutable Collections 结合使用
usingSystem.Collections.Immutable;// 使用不可变集合作为 params 参数publicvoidProcessItems(paramsImmutableArray<string>items){foreach(variteminitems){Console.WriteLine(item);}}// 调用ProcessItems("apple","banana","cherry");

高级用法

泛型方法与 params 集合
// 泛型方法中使用 params 集合publicvoidProcessCollection<T>(paramsList<T>collection)whereT:notnull{foreach(varitemincollection){Console.WriteLine(item);}}// 调用ProcessCollection("a","b","c");// 字符串列表ProcessCollection(1,2,3);// 整数列表
与模式匹配结合使用
// 使用模式匹配处理 params 集合publicvoidHandleValues(paramsint[]values){switch(values){case[varfirst,..varmiddle,varlast]:Console.WriteLine($"首:{first}, 尾:{last}, 中间有{middle.Length}个元素");break;case[varsingle]:Console.WriteLine($"单个值:{single}");break;case[]:Console.WriteLine("空集合");break;}}// 调用HandleValues(1,2,3,4,5);// 输出: 首: 1, 尾: 5, 中间有 3 个元素HandleValues(42);// 输出: 单个值: 42HandleValues();// 输出: 空集合
与接口结合使用
// 使用接口作为 params 参数publicvoidProcessEnumerables(paramsIEnumerable<int>[]collections){foreach(varcollectionincollections){intsum=collection.Sum();Console.WriteLine($"集合总和:{sum}");}}// 调用ProcessEnumerables(newList<int>{1,2,3},newint[]{4,5,6},newHashSet<int>{7,8,9});
高性能求和(使用Span<T>
publicdecimalAverage(paramsSpan<decimal>numbers){if(numbers.Length==0)return0;decimalsum=0;foreach(varnuminnumbers){sum+=num;}returnsum/numbers.Length;}Console.WriteLine(Average(1.5m,2.5m,3.5m));// 输出: 2.5
  • 使用Span<decimal>避免数组分配,提高性能。

  • 适合处理大量数值计算。

适用场景

  • 简化方法调用:允许调用者传递任意数量的参数,减少重载需求。

  • 处理集合数据:适合处理列表、数组或序列,例如日志记录、字符串连接、数学计算。

  • 高性能场景(C# 12+):使用Span<T>ReadOnlySpan<T>减少堆分配,优化性能。

  • 与本机代码交互:Span<T>类型的params参数适合传递连续内存块。

  • 灵活接口设计:为方法提供通用接口,支持不同数量的输入。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/7 16:17:56

探索:在微软工作是一种怎样的体验(二)

Q&#xff1a;江湖中总在流传微软的传说&#xff0c;微软的真实工作环境是什么样的&#xff1f; 先来听听微软的 HR 怎么说&#xff1a; 考勤打卡 微软研发工程师实行的是弹性工作制&#xff0c;不需要打卡&#xff0c;特殊情况还可以在家办公&#xff0c;每年过年提前一两个…

作者头像 李华
网站建设 2026/7/7 18:17:12

小红书评论区无限采集工具

红薯采集最新游客协议&#xff01;不用登录ck账号&#xff01;不会出现平台安全限制​&#xff01;可无限采集&#xff01; 跳过平台反爬机制&#xff01;

作者头像 李华
网站建设 2026/7/7 18:52:37

网络设计方案,综合布线方案,综合安防建设方案

第一章 基础网络设计1.1 现状与目标现状分析建设目标1.2 方案总览理念与原则总体设计1.3 骨干网络设计基础区域网络规划1.4 无线网络设计设计原则与传播特性覆盖场景与漫游切换QOS机制设计1.5 点位部署规划点位部署表与详细设计1.6 网络管理平台管理子系统与运营子系统1.7 认证…

作者头像 李华
网站建设 2026/7/7 5:15:35

3分钟快速配置Arm Compiler 5.06:解决MDK5.37缺失编译器问题

3分钟快速配置Arm Compiler 5.06&#xff1a;解决MDK5.37缺失编译器问题 【免费下载链接】ArmCompiler5.06update7build960Lin32-官网最新版Arm处理器的编译工具 最新发布的MDK5.37已经不再安装Arm Compiler 5&#xff08;ARMCC&#xff09;编译器。在Target选项卡中选择编译器…

作者头像 李华
网站建设 2026/7/7 18:37:10

PS 样式参考:UI 图标画风不统一?一张图让 AI 自动“视觉对齐”

做游戏 UI 或者资源美术的兄弟们&#xff0c;这种“风格地狱”肯定没少下&#xff1a;主美定了一张“极品”风格的道具图标&#xff08;比如一个厚涂风格的宝箱&#xff09;。 “好&#xff0c;这个风格定了。” “接下来这 50 个道具&#xff08;药水、卷轴、武器、防具&#…

作者头像 李华
网站建设 2026/7/7 18:00:42

Wan2.2-T2V-A14B模型对古代建筑营造技艺的数字复原

Wan2.2-T2V-A14B模型对古代建筑营造技艺的数字复原 在故宫博物院某次特展上&#xff0c;一段短短30秒的动画视频吸引了无数观众驻足&#xff1a;画面中&#xff0c;一群身着宋代工服的匠人正合力竖起一根粗壮木柱&#xff0c;随后精准安装斗拱、架设梁枋&#xff0c;整个过程严…

作者头像 李华