创建 record/tuple 以将几个对象作为单个参数传递的简单语法?

Simple syntax to create a record/tuple to pass few objects as a single parameter?

考虑用例:我需要将参数传递给 QueueUserWorkItem:

ThreadPool.QueueUserWorkItem((o) =>
{
    var item = o as MyObject;
},
item);

然后要求改变了,我现在需要传递 2 个对象。所以我必须写这样的东西:

ThreadPool.QueueUserWorkItem((o) =>
{
    var items = o as Tuple<MyObject,MyObject2>;
},
new Tuple<MyObject,MyObject2>(item1, item2));

在 C# 9+ 中是否有更简洁的方法来实现此目的?

您始终可以在 C# lambda 中利用 closures 并完全放弃传递参数:

var item1 = ...;
var item2 = ...;
ThreadPool.QueueUserWorkItem(_ =>
{
    Console.WriteLine(item1);
    Console.WriteLine(item2);
});

另外我个人会考虑切换到 Task.Run 而不是 ThreadPool.QueueUserWorkItem(尽管由于一些 differences in behaviour 应该有一些考虑)。

如果您的目标框架有,您可以使用 this overload。然后你可以这样做:

ThreadPool.QueueUserWorkItem(args => {
    var first = args.Item1; // it's of type string already
    var second = args.Item2; // this is int
}, ("a", 1), false);

或者:

ThreadPool.QueueUserWorkItem(args => {
    var first = args.first; // it's of type string already
    var second = args.second; // this is int
}, (first: "a", second: 1), false); // name parameters here instead of using Item1 Item2

并且在单参数情况下,您不需要从对象转换类型(此重载接受通用 Action<T> 委托)。