浅谈 C# 13 中的 params 集合

前言

在 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();
        }
    }

基准测试报告

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

最后总结

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

参考文章

相关推荐
追逐时光者2 天前
一种更简单的方式运行 C# 代码,简化 C# 开发体验!
【.net】·【c#】·【.net core】
追逐时光者11 天前
C#/.NET/.NET Core技术前沿周刊 | 第 39 期(2025年5.19-5.25)
【.net】·【c#】·【.net core】·【技术前沿周刊】
追逐时光者14 天前
一个使用 WPF 开发的 Diagram 画板工具(包含流程图FlowChart,思维导图MindEditor)
【.net】·【开源项目】·【实用工具】·【wpf】
追逐时光者15 天前
一个基于 C# 编写的事件驱动、具备专业水准的算法交易平台(量化交易引擎)
【.net】·【c#】·【开源项目】
追逐时光者18 天前
C#/.NET/.NET Core技术前沿周刊 | 第 38 期(2025年5.12-5.18)
【.net】·【c#】·【开源项目】·【技术前沿周刊】
追逐时光者19 天前
一款基于 .NET 开源、可以拦截并修改 WinSock 封包的 Windows 软件
【.net】·【开源项目】·【实用工具】
追逐时光者21 天前
再也不用为找项目发愁了,C#/.NET/.NET Core优秀项目和框架精选值得你拥有!
【.net】·【开源项目】
追逐时光者23 天前
一套基于 Bootstrap 和 .NET Blazor 的开源企业级组件库
【.net】·【c#】·【开源项目】·【blazor】
追逐时光者24 天前
C#/.NET/.NET Core技术前沿周刊 | 第 37 期(2025年5.1-5.11)
【.net】·【c#】·【.net core】·【技术前沿周刊】