为什么有些C#方法使用对象来传递参数,而不是直接传递参数?

为什么有些C#方法使用对象来传递参数,而不是直接传递参数?,c#,object,methods,C#,Object,Methods,我见过一些C#方法,比如,它采用一个方法(在本例中为“WaitCallback”),但不是提供直接向方法传递参数的选项,而是采用一个单独的对象来提供参数。 所以你不能做被要求做的事情 我的问题是:为什么? 使用这种方法必须有技术上的原因,不允许出现类似的情况 ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3))); private int Multiply(int x,int y) { int z=(x*y); re

我见过一些C#方法,比如,它采用一个方法(在本例中为“WaitCallback”),但不是提供直接向方法传递参数的选项,而是采用一个单独的
对象来提供参数。

所以你不能做被要求做的事情

我的问题是:为什么?
使用这种方法必须有技术上的原因,不允许出现类似的情况

ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));

private int Multiply(int x,int y)
{
  int z=(x*y);
  return z;
}

因为您想将委托传递给
WaitCallBack
。简单地说,您想告诉
WaitCallBack
线程必须执行的方法,但现在不想调用该方法

在你的例子中

ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
将直接调用方法
Multiply
,并将其结果传递给
WaitCallback
构造函数(这是不可能的)

编译器无法决定是要在此处调用
乘法
,还是只想告诉
WaitCallback
,它必须执行该调用,因为它的语法完全相同

这就是为什么您告诉它应该调用哪个方法,以及(分别地)当它最终调用它时应该传递哪个参数


但您可以使用lambda:

ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));

现在线程可以执行这个lambda,它依次调用
Multiply(2,3)
(丢弃参数
o
)。

因为要将委托传递给
WaitCallBack
。简单地说,您想告诉
WaitCallBack
线程必须执行的方法,但现在不想调用该方法

在你的例子中

ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
将直接调用方法
Multiply
,并将其结果传递给
WaitCallback
构造函数(这是不可能的)

编译器无法决定是要在此处调用
乘法
,还是只想告诉
WaitCallback
,它必须执行该调用,因为它的语法完全相同

这就是为什么您告诉它应该调用哪个方法,以及(分别地)当它最终调用它时应该传递哪个参数


但您可以使用lambda:

ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));

现在线程可以执行这个lambda,它依次调用
Multiply(2,3)
(丢弃参数
o
)。

newwaitcallback(Multiply(2,3))
将直接运行
Multiply(2,3)
,并将结果作为WaitCallback的参数。这不是您想要的-您需要分别发送要调用的参数和方法,以便可以在另一个线程上调用它。
new WaitCallback(Multiply(2,3))
将直接运行
Multiply(2,3)
,并将结果作为参数提供给WaitCallback。这不是您想要的-您需要分别发送要调用的参数和方法,以便可以在另一个线程上调用它?尽管如此,如果C#creators是专用的,难道他们不能这样做吗?在这个“特殊”方法中使用
Multiply(2,3)
将不会立即调用它,而是以某种方式“存储”以便在另一个线程中与这些参数一起使用,就像传递
对象一样。@J.Doe:最终,他们可以,但为什么他们会这样做呢?如果您必须知道每个方法调用(即
a(b)
语法)在调用出现的特定情况下,调用是立即执行还是像您所说的那样“存储”,这会不会让一切变得非常混乱?@J.Doe lambda工作。对于第二个问题,我们必须问c#团队,但我认为这样的功能没有任何好处,但有很多麻烦(而且可能也是一个突破性的改变)。他们可以构建隐式转换(因为参数类型是委托,编译器可以将调用转换为lambda),但我认为这会带来更多麻烦,而不是帮助。。。即使你能清楚地区分开发人员在这段代码中的意图。@RenéVogt,很抱歉,最初我尝试它时说我必须等待,但我忘记了,因为我下意识地接受了它作为答案。:)那么lambda语法会起作用吗?尽管如此,如果C#creators是专用的,难道他们不能这样做吗?在这个“特殊”方法中使用
Multiply(2,3)
将不会立即调用它,而是以某种方式“存储”以便在另一个线程中与这些参数一起使用,就像传递
对象一样。@J.Doe:最终,他们可以,但为什么他们会这样做呢?如果您必须知道每个方法调用(即
a(b)
语法)在调用出现的特定情况下,调用是立即执行还是像您所说的那样“存储”,这会不会让一切变得非常混乱?@J.Doe lambda工作。对于第二个问题,我们必须问c#团队,但我认为这样的功能没有任何好处,但有很多麻烦(而且可能也是一个突破性的改变)。他们可以构建隐式转换(因为参数类型是委托,编译器可以将调用转换为lambda),但我认为这会带来更多麻烦,而不是帮助。。。即使你能清楚地区分开发人员在这段代码中的意图。@RenéVogt,很抱歉,最初我尝试它时说我必须等待,但我忘记了,因为我下意识地接受了它作为答案。:)