浅谈 C# 13 中的 Params 集合

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

前言

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

params的适用场景

params适用于参数个数动态变化的场景,例如日志、数学计算或格式化输出等,减少冗余代码,增强方法通用性。

C# 13 的改进与旧版本对比

在 C# 13 之前:

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

在 C# 13 中:

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 关键字之后不允许有任何其他参数,并且在方法声明中只允许有一个 params 关键字。

性能基准测试

下面我们使用一个数据求和场景,对C# 13 之前和C# 13 中的改进方式使用BenchmarkDotNet做一下性能基准测试对比:

[MemoryDiagnoser]//记录内存分配情况
    [MarkdownExporter, AsciiDocExporter, HtmlExporter, CsvExporter, RPlotExporter]
    public class ParamsBenchmark
    {
        private List<int> dataList = new();

        /// <summary>
        /// 初始化测试数据
        /// 如创建大型数据集、分配内存资源等,避免在每次基准测试迭代中重复初始化带来的性能干扰
        /// </summary>
        [GlobalSetup]
        public void Setup()
        {
            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 };
        }

        [Benchmark]
        public int CalculateOldSum()
        {
            return OldSumArray(dataList.ToArray());
        }

        [Benchmark]
        public int CalculateNewSumList()
        {
            return NewSumList(dataList);
        }

        /// <summary>
        /// C# 13 之前
        /// </summary>
        /// <param name="datas">datas</param>
        /// <returns></returns>
        public int OldSumArray(params int[] datas)
        {
            return datas.Sum();
        }

        /// <summary>
        /// C# 13 中
        /// </summary>
        /// <param name="datas">datas</param>
        /// <returns></returns>
        public int NewSumList(params List<int> datas)
        {
            return datas.Sum();
        }
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.

基准测试报告

图片图片

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

最后总结

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

参考文章

责任编辑:武晓燕 来源: 追逐时光者
相关推荐

2009-05-08 09:46:37

微软C#集合对象

2009-08-18 09:06:41

C#对象和集合

2009-07-31 13:48:34

C# eval()函数

2009-02-05 15:32:23

接口委托

2009-08-26 15:28:52

C#对象集合初始化器

2024-11-22 15:39:02

C#Params编程

2011-09-21 10:56:31

C#结构

2009-08-20 18:30:33

C# ReaderWr

2009-08-03 15:06:43

C# Stack对象C# Queue对象

2009-08-14 10:51:43

2009-09-17 17:13:54

C#数组

2009-06-24 10:49:16

JavaScript

2009-09-02 10:58:02

C#动态数组

2009-08-14 17:58:05

C#接口方法

2009-08-26 13:15:38

C#选择控制

2009-08-26 15:46:01

C#匿名类型

2009-08-25 16:16:43

C# oledbcon

2009-08-06 15:30:23

C#类型系统

2009-09-02 15:41:21

C# HTTPWebR

2009-08-20 10:24:52

C#开发WinForm
点赞
收藏

51CTO技术栈公众号