4

我看到的 90% 的示例,包括 MSDN 都使用以下语法:

ThreadPool.QueueUserWorkItem(new WaitCallback(MyCallback));

其他 10% 使用:

ThreadPool.QueueUserWorkItem(MyCallback);

在这两种情况下,MyCallback 都是静态函数。

编译器没有给出错误,并且代码似乎以任何一种方式工作。不创建新的 WaitCallback 对象而直接传递函数是否有危险?

我问是因为我试图在我的代码中找到一些错误,一旦我缩小范围,我将用更具体的问题来解决,但也是这个一般性问题,因为我一直很好奇并且找不到任何答案。我发现的最接近的是:

http://msdn.microsoft.com/en-us/library/4yd16hza%28v=vs.90%29.aspx

其中指出:

“Visual Basic 用户可以省略 WaitCallback 构造函数,而在将回调方法传递给 QueueUserWorkItem 时只需使用 AddressOf 运算符。Visual Basic 会自动调用正确的委托构造函数。”

...但实际上并没有说“C# 用户必须使用构造函数”,我也想知道为什么/details。我正在使用.NET 3.5。

4

1 回答 1

8
ThreadPool.QueueUserWorkItem(new WaitCallback(MyCallback));

ThreadPool.QueueUserWorkItem(MyCallback);

是等价的并且被编译成相同的字节码。编译器会为您插入new WaitCallback调用。

来自MSDN

Del<int> m1 = new Del<int>(Notify);

C# 2.0 版有一个称为方法组转换的新功能,它适用于具体以及通用委托类型,并且使您能够使用这种简化的语法编写上一行:

Del<int> m2 = Notify;
于 2013-03-29T01:23:47.777 回答