繁体   English   中英

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

[英]C# / Lambda : object parameter explanation request (noob)

这里有一个问题,这篇文章完全是新的: 带有lambda表达式和匿名方法的ThreadPool.QueueUserWorkItem

具体如下:

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

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

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

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

所以,完整版的通话可能是

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的类型。 由于这个参数不是真的需要,它也缩写为它的类型的第一个字母。

QueueUserWorkItem文档中,第一个参数是具有以下定义的WaitCallback

public delegate void WaitCallback(
    Object state
)

国家的定义是:

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

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

只需查看o是一个状态对象,您可以使用QueueUserWorkItem的重载版本传递给已执行的方法。 如果没有显式传递, null

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM