找回密码
 立即注册
首页 业界区 业界 浅谈 C# 13 中的 params 集合

浅谈 C# 13 中的 params 集合

丧血槌 4 天前
前言

在 C# 13 中,params 的改进使其从可变数量的数组参数升级为可变数量的集合类型参数。这一改进通过支持高性能集合类型(如Span,ReadOnlySpan)和简化调用语法,显著提升了代码的灵活性和效率。
params的适用场景

params适用于参数个数动态变化的场景,例如日志、数学计算或格式化输出等,减少冗余代码,增强方法通用性。
C# 13 的改进与旧版本对比

在 C# 13 之前:

params 仅支持一维数组(如params int[] list、params object[] list)。调用方法时需显式传递数组或数组元素类型的参数的逗号分隔列表。
在 C# 13 中:

params 修饰符并不局限于数组类型。 现在可以将 params 用于任何已识别的集合类型,包括 System.Span、System.ReadOnlySpan,以及那些实现 System.Collections.Generic.IEnumerable 并具有 Add 方法的类型。 除了具体类型外,还可以使用接口 System.Collections.Generic.IEnumerable、System.Collections.Generic.IReadOnlyCollection、System.Collections.Generic.IReadOnlyList、System.Collections.Generic.ICollection和 System.Collections.Generic.IList。
注意事项

在方法声明中的 params 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。
性能基准测试

下面我们使用一个数据求和场景,对C# 13 之前和C# 13 中的改进方式使用BenchmarkDotNet做一下性能基准测试对比:
  1.     [MemoryDiagnoser]//记录内存分配情况<br>    [MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter]<br>    public class ParamsBenchmark<br>    {<br>        private List<int> dataList = new();<br><br>        /// <summary><br>        /// 初始化测试数据<br>        /// 如创建大型数据集、分配内存资源等,避免在每次基准测试迭代中重复初始化带来的性能干扰<br>        /// </summary><br>        [GlobalSetup]<br>        public void Setup()<br>        {<br>            dataList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 9, 10, 22, 55, 66, 88, 44, 66, 33, 77, 54, 24, 8789, 24, 54, 244, 377, 26, 99, 888, 1000 };<br>        }<br><br>        [Benchmark]<br>        public int CalculateOldSum()<br>        {<br>            return OldSumArray(dataList.ToArray());<br>        }<br><br>        [Benchmark]<br>        public int CalculateNewSumList()<br>        {<br>            return NewSumList(dataList);<br>        }<br><br>        /// <summary><br>        /// C# 13 之前<br>        /// </summary><br>        /// <param name="datas">datas</param><br>        /// <returns></returns><br>        public int OldSumArray(params int[] datas)<br>        {<br>            return datas.Sum();<br>        }<br><br>        /// <summary><br>        /// C# 13 中<br>        /// </summary><br>        /// <param name="datas">datas</param><br>        /// <returns></returns><br>        public int NewSumList(params List<int> datas)<br>        {<br>            return datas.Sum();<br>        }<br>    }<br>
复制代码
基准测试报告

1.png


  • Mean: 所有测量值的算术平均值。
  • Error: 99.9% 置信区间的一半。
  • StdDev: 所有测量值的标准差。
  • Gen0: 第 0 代 GC 每 1000 次操作收集一次。
  • Allocated: 每次操作分配的内存(仅托管内存,包含所有内容,1KB = 1024B)。
最后总结

综上所述C# 13 中的 params 集合变得类型更灵活,满足更复杂的应用场景,并且性能得到了进一步的提升。
参考文章


  • https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/proposals/csharp-13.0/params-collections
 
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册