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

J. *_*Doe 1 c# methods object

我见过一些C#方法,比如ThreadPool.QueueUserWorkItem(WaitCallback,Object),它采用一种方法(在本例中为"WaitCallback"),而不是提供一个直接将参数传递给方法的选项,而是单独Object使用供应他们.
所以你不能做像这里被问到的事情.

我的问题是:为什么?
必须有技术上的理由使用这种方法,不允许这样的东西

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

private int Multiply(int x,int y)
{
  int z=(x*y);
  return z;
}
Run Code Online (Sandbox Code Playgroud)

Ren*_*ogt 8

因为你想传递一个委托WaitCallBack.在简单的话,你要告诉WaitCallBack线程必须执行的方法,但你不想调用该方法现在.

在你的例子中

ThreadPool.QueueUserWorkItem(new WaitCallback(Multiply(2, 3)));
Run Code Online (Sandbox Code Playgroud)

该方法Multiply将被直接调用,其结果应该传递给WaitCallback构造函数(这是不可能的).

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

那么你告诉它应该调用哪个方法方法 - 分开 - 它最终调用时应该传递哪个参数.


但你可以使用lambda代替:

ThreadPool.QueueUserWorkItem(o => Multiply(2, 3));
Run Code Online (Sandbox Code Playgroud)

现在线程可以执行这个lambda,而lambda又调用Multiply(2, 3)(丢弃参数o).

  • @ J.Doe:最终,他们*可以*,但他们为什么会这样?如果您必须知道每个方法调用(即`a(b)`语法)是否在调用出现的特定情况下,调用是立即执行还是"存储",它是否会使一切变得非常混乱",你怎么称呼它? (2认同)