4

MSDN を含む、私が目にする例の 90% は、次の構文を使用しています。

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 ユーザーは、コールバック メソッドを QueueUserWorkItem に渡すときに、WaitCallback コンストラクターを省略し、単純に 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 に答える