C#/ Lambda:对象参数说明请求(noob)

时间:2009-11-22 18:32:46

标签: c# lambda

这里有一个问题,请注意以下帖子:ThreadPool.QueueUserWorkItem with a lambda expression and anonymous method

具体这一点:

ThreadPool.QueueUserWorkItem(
    o => test.DoWork(s1, s2)
    );

有人可以解释'o'是什么?我可以看到(在VS2008中)它是一个对象参数,但我基本上不明白为什么以及如何。

5 个答案:

答案 0 :(得分:10)

ThreadPool.QueueUserWorkItem需要WaitCallback个委托作为参数。

此委托类型对应于void类型的一个参数的Object函数。

因此,完整版本的调用可能是

ThreadPool.QueueUserWorkItem(
    new WaitCallback(delegate(object state) { test.DoWork(s1,s2); });
);

更简洁将是

ThreadPool.QueueUserWorkItem(
    delegate(object state) { test.DoWork(s1,s2); };
);

使用C#3.0语法,我们可以用更简短的形式编写它:

ThreadPool.QueueUserWorkItem(
    (object state) => { test.DoWork(s1,s2); };
);

C#3.0 lambda语法允许省略state的类型。由于这个参数不是真的需要,它也缩写为它的类型的第一个字母。

答案 1 :(得分:1)

来自QueueUserWorkItem的{​​{3}},第一个参数是documentation,其定义如下:

public delegate void WaitCallback(
    Object state
)

州的定义是:

 Type: System.Object
 An object containing information to be used by the callback method.

因此QueueUserWorkItem的第一个参数是一个接受一个对象(一个可选的用户状态)并执行返回void的函数的函数。在您的代码中,o是用户状态对象。在这种情况下不使用它,但它必须在那里。

答案 2 :(得分:0)

look it upo是一个状态对象,您可以使用QueueUserWorkItem的重载版本传递给已执行的方法。当您没有明确传递时,它是null

这种方式在没有lambda表达式时很有用。

答案 3 :(得分:0)

o是lambda函数的形式参数。其类型由QueueUserWorkItem的参数类型派生。

答案 4 :(得分:0)

其他答案都很好,但是如果你看到什么是等效的,而不使用lambda表达式和委托方法(也就是说,以.NET 1方式进行),也许会有所帮助:

void SomeMethod()
{
  //...
  ThreadPool.QueueUserWorkItem(new WaitCallback(TheCallback));
  //...
}

void TheCallback(object o)
{
  test.DoWork(s1, s2);
}