2012-04-19 7 views
1

次のコードは共通です:スレッドとそのメソッドをブリッジするためにデリゲートが必要なのはなぜですか?

Work w = new Work(); 
w.Data = 42; 
threadDelegate = new ThreadStart(w.DoMoreWork); 
newThread = new Thread(threadDelegate); 
newThread.Start(); 

ブリッジスレッドとそのスレッド上で実行するためのメソッドにデリゲートがなければならない、なぜ私は、疑問に思いますか?

スレッドに直接メソッド名を送信できますか?

答えて

5

スレッドにメソッド名を直接送信できますか?

文字列として? Ewww。文字列でない場合は、どのように実行するかをスレッドに伝えることを提案しますか?デリゲートはイディオムので、「特定のシグネチャで実行するもの」を.NETで表現する方法です。

new ThreadStartを使用するか、別の変数を使用する必要はありません。これは、メソッドグループの変換使用して正常に動作します:

new Thread(new Work { Data = 42 }.DoWork).Start(); 

EDITは:.NET 4のように、それは一般良いアイデアだということに注意してください

newThread = new Thread(w.DoMoreWork); 
newThread.Start(); 

かを、あなたはすべてのこれらの変数を必要としない場合この種のものにはTask Parallel Libraryを使用してください。

+0

@SteveTownsend:確かに。 –

+2

Btw Jon、マネージドデリゲートとC関数ポインタの間に、同様の使い方(スレッドの開始など)を超えた関係がありますか?いいえ、それは良い考えです。デリゲートは '+ = '演算子を持つので、メソッドの内部リストを保持する可能性が最も高いことは知っていますが、他に何が言えるでしょうか? – Tudor

2

デリゲートは、IntegerやDoubleのようなデータ型を表し、それぞれのデータ型を表します。デリゲートは、シグネチャ(戻り値の型とパラメータ)によって識別される関数のクラスを定義します。 IntegerメソッドパラメータでInteger値が必要であることを指定するのと同じように、デリゲートは特定のシグネチャを持つメソッドが必要であることを指定します。プリミティブデータ型が使用されるのと同じ理由で予想される関数のタイプを指定する必要があります。あなたの関数を渡すと、関数へのポインタ、つまり呼び出したいオブジェクトメソッド、つまりその関数が定義されているメモリ内の場所が渡されます。関数名を文字列として渡しただけでは、その名前の関数がどこにあるのかわからなくなります。呼び出したい関数の定義を含むクラスを何らかの形で定義していない限り、そうではありません。

代表者に関する詳しい情報は、以下を参照してください。

Info on C# delegates from Microsoft

stackoverflow question - why-do-we-need-c-sharp-delegates

次のリンクは名前でメソッドを呼び出すためにJavaでリフレクションを使用した例です。表示されているように、呼び出すメソッドを含むクラスを指定する必要があります。デリゲートへの実際のパラメータは、メソッドに直接ポインタするため、シグネチャが一致する必要があります。

Java reflection

関連する問題