音频分类实战:从梅尔频谱到工业部署的全链路解析
2026/6/21 3:34:50
Params Collections是C# 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 T[]仍然有效
新语法不会破坏已有代码
在C# 12之前,params关键字只能用于数组:
// 传统的 params 数组用法publicvoidProcessNumbers(paramsint[]numbers){foreach(varnumberinnumbers){Console.WriteLine(number);}}// 调用方式ProcessNumbers(1,2,3,4,5);C# 12扩展了params关键字,使其能够用于任何集合类型,只要该类型满足特定条件。
// 使用 params 与集合类型publicvoidProcessNumbers(paramsList<int>numbers){foreach(varnumberinnumbers){Console.WriteLine(number);}}// 调用方式不变ProcessNumbers(1,2,3,4,5);要使集合类型能够与params关键字一起使用,必须满足以下条件之一:
集合类型必须有一个无参数的构造函数
集合类型必须有一个Add方法,用于添加元素
集合类型必须实现IEnumerable<T>
// 自定义集合类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 作为 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, 10usingSystem.Collections.Immutable;// 使用不可变集合作为 params 参数publicvoidProcessItems(paramsImmutableArray<string>items){foreach(variteminitems){Console.WriteLine(item);}}// 调用ProcessItems("apple","banana","cherry");// 泛型方法中使用 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参数适合传递连续内存块。
灵活接口设计:为方法提供通用接口,支持不同数量的输入。