C# 13 新特性 params collection
内容提要
C# 13 引入了“params”集合的新功能,允许使用各种集合类型,如 List<int> 和 IEnumerable<int>。自定义集合也可以与“params”一起使用。使用不同集合类型重载方法可能导致歧义,但更具体的类型具有更高的优先级。Span 类型具有更高的性能且不需要内存分配。.NET 9 添加了许多新的“params span”方法重载。
延伸解读
重载解析的优先级规则
当多个 params 重载同时存在时,编译器会优先选择更具体的类型。例如,ReadOnlySpan<int> 比 int[] 更具体,因此调用时会匹配 Span 方法。而 IEnumerable<int> 的优先级较低,当同时存在 int[] 和 List<int> 重载时,编译器无法确定使用哪个,导致编译错误。移除其中一个后,错误消失,并默认使用具体类型的方法。
OverloadResolutionPriorityAttribute 的现状
C# 13 引入了 OverloadResolutionPriorityAttribute,允许开发者指定方法解析的优先级,数字越大优先级越高。但在 .NET 9 Preview 5 中,该特性尚未被编译器支持,即使设置了较高优先级,实际调用仍遵循原有规则。需要等待后续版本或 Roslyn 的更新才能生效。
Span 带来的性能优势
使用 params ReadOnlySpan<int> 可以避免创建数组,从而减少内存分配和 GC 压力。基准测试显示,Span 方法在性能上优于数组方法,且没有内存分配。.NET 9 中许多方法也基于此特性新增了 params span 重载,以提升性能。
Q&A
C# 13 中 params 集合的新特性是什么?
C# 13 引入了 params 集合的新功能,支持多种集合类型,如 List<int> 和 IEnumerable<int>,并允许与自定义集合一起使用。
如何在 C# 13 中使用自定义集合与 params?
可以通过实现 IEnumerable 接口的自定义集合,并在方法中使用 params 关键字来支持自定义集合。
在 C# 13 中,params 的重载方法如何处理类型优先级?
在重载方法中,具体类型的优先级高于 IEnumerable,导致编译器优先匹配更具体的类型,如 ReadOnlySpan 和数组。
Span 类型在 C# 13 中有什么优势?
Span 类型具有更高的性能,不需要内存分配,从而减少 GC 压力,提升整体性能。
如何指定方法解析的优先级?
可以使用 OverloadResolutionPriorityAttribute 来指定方法解析的优先级,但在 .NET 9 Preview 5 中尚未生效。
C# 13 中的 params span 方法重载有什么新特性?
在 .NET 9 中,许多方法基于 params span 特性新增了重载,提升了性能。