为什么有些C#方法使用对象来传递参数,而不是直接传递参数?
我见过一些C#方法,比如,它采用一个方法(在本例中为“WaitCallback”),但不是提供直接向方法传递参数的选项,而是采用一个单独的为什么有些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
对象来提供参数。
所以你不能做被要求做的事情
我的问题是:为什么?
使用这种方法必须有技术上的原因,不允许出现类似的情况
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,很抱歉,最初我尝试它时说我必须等待,但我忘记了,因为我下意识地接受了它作为答案。:)