C# 13 新特性 params collection

💡 原文中文,约6300字,阅读约需15分钟。
📝

内容提要

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 特性新增了重载,提升了性能。

🏷️

标签

➡️

继续阅读