【问题标题】:Why some C# methods use an object to pass parameters instead of actually passing them directly?为什么有些 C# 方法使用对象来传递参数,而不是直接传递它们?
【发布时间】:2018-10-04 15:30:09
【问题描述】:

我见过一些 C# 方法,例如 ThreadPool.QueueUserWorkItem(WaitCallback, Object),它们采用一个方法(在本例中为“WaitCallback”),但没有提供直接将参数传递给该方法的选项,而是采用单独的 Object可以供应他们。
所以你不能做类似被问到here的事情。

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

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

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

【问题讨论】:

  • new WaitCallback(Multiply(2, 3)) 将直接运行 Multiply(2,3) 并将结果作为参数提供给 WaitCallback。这不是您想要的 - 您需要发送参数和方法以分别调用,以便可以在另一个线程上调用它。

标签: c# object methods


【解决方案1】:

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

在你的例子中

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

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

编译器无法决定您是想在此处调用 Multiply 还是只想告诉WaitCallback 必须进行该调用,因为这完全是语法相同。

这就是为什么你告诉它它应该调用哪个方法方法,以及——另外——它最终调用它时应该传递哪个参数。


但你可以使用 lambda 代替:

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

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

【讨论】:

  • 那么 lambda 语法会起作用吗?尽管如此,如果 C# 的创建者是专门的,他们不能做到这一点,以便在这个“特殊”方法中使用 Multiply(2, 3) 会标记它不会立即被调用,而是以某种方式“存储”以在另一个线程中与这些参数一起使用,比如传递Object 会吗?
  • @J.Doe:最终,他们可以,但他们为什么会这样做呢?如果您必须知道对于每个方法调用(即a(b) 语法),在调用出现的特定情况下,调用是立即执行还是“存储”,这不会让一切都变得非常混乱,如你叫它?
  • @J.Doe lambda 有效。对于第二个问题,我们将不得不询问 c# 团队,但我看不出这样的功能有什么好处,但会带来很多麻烦(而且它也可能是一个破坏性更改) .他们可以构建隐式转换(因为参数类型是委托,编译器可以将调用转换为 lambda),但我认为它会造成比它更多的麻烦有帮助...即使您可以清楚地区分开发人员在相关代码中的意图。
  • @RenéVogt,对不起,最初当我尝试它时说我必须等待但我忘记了,因为我下意识地接受了它作为答案。 :)
猜你喜欢
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
相关资源
最近更新 更多