C# 9+是否有更简洁语法创建记录/元组以传递多对象作为单个参数
C# 9及以上版本有多种更简洁的实现方式,可选方案如下:
- 方案1:使用值元组(ValueTuple)简化传参和类型转换
不用再手动实例化Tuple<>类,直接使用值元组字面量传参,还支持直接解构得到两个对象,代码比原实现简洁很多:
ThreadPool.QueueUserWorkItem(o => { // 直接解构为两个对象,无需逐个访问Item属性 var (item1, item2) = (ValueTuple<MyObject, MyObject2>)o; // 后续直接使用item1、item2即可 }, // 直接写值元组字面量,无需new Tuple<>构造 (item1, item2));
- 方案2:直接通过lambda捕获外部变量(最简洁,无类型转换开销)
如果item1和item2在调用QueueUserWorkItem的作用域内不会被后续逻辑意外修改,直接用lambda捕获外部变量即可,完全不需要做参数传递和类型转换:
ThreadPool.QueueUserWorkItem(_ => { // 直接使用外部作用域的item1、item2,无需任何转换 });
- 方案3:配合泛型重载避免装箱拆箱(.NET 5+/C# 9+适用)
如果使用的是.NET 5及以上版本,框架自带泛型版QueueUserWorkItem重载,无需将参数装箱为object,配合值元组使用性能更高、写法更简洁:
ThreadPool.QueueUserWorkItem(state => { var (item1, item2) = state; }, (item1, item2), // 最后一个参数表示是否流动执行上下文,不需要可传false降低开销 false);
内容的提问来源于stack exchange,提问作者Boppity Bop
相关产品推荐
相关产品推荐

