1

次のコードが一般的です。

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

スレッドとそのスレッドで実行するメソッドをブリッジするためのデリゲートが必要なのはなぜですか?

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

4

2 に答える 2

5

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

文字列として?Ewww。文字列としてではない場合、スレッドに何を実行するかをどのように指示しますか?デリゲートは、.NETで「特定の署名を使用して実行するもの」を表す慣用的な方法です。

new ThreadStart別の変数を使用または使用する必要はないことに注意してください。これは、メソッドグループ変換を使用して正常に機能します。

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

または、これらすべての変数が必要ない場合:

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

編集:.NET 4の時点では、この種のことにはタスク並列ライブラリを使用する方が一般的に良い考えであることに注意してください。

于 2012-04-19T14:42:51.840 に答える
2

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

デリゲートの詳細については、以下を参照してください。

MicrosoftからのC#デリゲートに関する情報

stackoverflowの質問-why-do-we-need-c-sharp-delegates

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

Javaリフレクション

于 2012-04-19T15:21:06.617 に答える