C#13提供的功能让您能够更轻松、更安全、更快速地以您熟悉和喜爱的风格编写代码。您可以在C#13中的新增功能中找到C#13功能的完整列表。
C#13实现了一项长期以来的功能请求,现在允许集合表达式支持的任何集合类型作为params参数,而不仅仅是数组。此功能基于C#12中引入的集合表达式功能。
C#13中的新增功能
使用集合表达式奠定基础
C#12中引入了集合表达式,为以前创建各种集合的无数种方法提供了一种替代方法。在方法上下文中,这允许您在许多场景中简化集合的使用,包括调用方法:
//C#12之后WriteByteArray([1,2,3]);WriteByteSpan([1,2,3]);
staticvoidWriteByteArray(byte[]bytes){}staticvoidWriteByteSpan(Span
这也使我们能够统一C#处理集合的方式。请注意,集合表达式可以推断集合的类型和成员的类型。
params数组
params自C#1.0以来就一直存在于该语言中。它允许调用代码以逗号分隔的列表形式包含零到多个参数。该方法以数组形式接收此列表,该列表可能为空:
staticvoidWriteByteArray(paramsbyte[]bytes){}
除了使用值列表进行调用外,您还可以使用数组调用带有params参数的方法。并且从C#12开始,它可以是集合表达式:
params集合
从C#13开始,params可以是任何支持集合表达式的集合类型:
staticvoidWriteByteSpan(paramsSpan
虽然这似乎是一个很小的变化,但它通常可以让编译器优化您的代码。例如,如果该方法使用paramsSpan,则编译器可以使用堆栈空间为该方法创建Span。这比分配数组的性能更好。
使用特定类型还可以向调用者传达集合的使用方式。例如,paramsIReadonlyList
如果您使用paramsIEnumerable
byte[]bytes=[1,2,3,4,5];WriteByteArray(bytes.Where(x=>x<4));
staticvoidWriteByteArray(paramsIEnumerable
当params接收器是接口并且参数是元素的离散列表或集合表达式时,编译器将使用具体类型。许多集合接口都有一个逻辑上合理的默认实现,例如IReadonlyList
重载
C#支持重载方法-这意味着如果参数类型不同,则可以存在多个同名方法。您可以像重载其他参数一样对params集合进行重载。
}
//此代码从静态本地函数转变为私有函数//因为局部函数不允许重载。privatestaticvoidWriteNumbers
//结果是:////Span//Span//Span//IEnumerable
例如,您可能在同一个解析范围内有一个带有paramsIEnumerable
编译器会为您挑选一个合理的重载。如果Span可用,它通常会被优先选择,因为这样可以避免在方法调用中进行内存分配。
无论您是否将params集合添加到您自己的代码中,它们都会使您的应用程序运行得更快,因为.NET运行时库现在可以在更多地方使用Span等高性能类型。您可以使用与params相同的概念,调用者在如何调用方法方面具有更大的灵活性,并且编译器将选择重载。
考虑重载
重载是C#的一个非常强大的功能。但与许多强大的功能一样,正确使用它非常重要。如果有多个同名的方法,它们应该执行相同的操作。它们在执行方式或性能上可能有所不同,但更改传递的类型不会给您的应用程序带来重大更改。通常,这意味着在调整参数值后调用单个实现。
如上例所示,调用代码的微小变化可能会导致调用不同的重载。对于所有C#应用程序来说都是如此,无论您是否使用params集合。
总结
我们对C#13中的参数集合感到非常兴奋,迫不及待地想听听您的想法!