3

次の宣言が表示されます。

ThreadStart myThreadDelegate = new ThreadStart(Work.DoWork);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();

次のように簡略化できますか?

Thread myThread = new Thread(new ThreadStart(Work.DoWork));
myThread.Start();

はいの場合、2 番目の方法は何と呼ばれますか? 各方法の長所と短所は何ですか?

4

6 に答える 6

5

次のように単純化することもできます。

var myThread = new Thread(Work.DoWork);
myThread.Start();

違いはあまりありません。最初の例では、デリゲート インスタンスは名前を取得します。myThreadDelegateこれは、理論的にはメソッドで後で (おそらく別の目的で) 使用できます。

多くのレベルを含む 1 つの長い式を好むか、一時変数を含む多くの小さな式を組み合わせて好むかは、ほとんどが好みの問題です。

いずれにせよ、私の意見では、Work.DoWorkを書くよりも、単に のように、メソッド グループから暗黙的な変換を使用する方が簡単new ThreadStart(Work.DoWork)です。How to: Declare, Instantiate, and Use a Delegate (C# Programming Guide)の文C# 2.0 provides a simple way to write theまえの宣言を参照してください。このより単純な方法は、正式にはメソッド グループ変換と呼ばれます。

varキーワードの詳細については、Implicitly Typed Local Variables (C# Programming Guide)を参照してください。

もちろん、あなたの例の究極のワンライナーは次のようになります。

(new Thread(Work.DoWork)).Start();

その場合、新しいスレッド (の変数) への参照すら取得しません (インスタンス メソッドは をStart()返しますvoid)。

于 2012-12-28T19:44:31.303 に答える
5

はい。それは何と呼ばれるものでもありません。賛否両論はありません。追加の C# 構文シュガーを次のように使用できます。

Thread myThread = new Thread(Work.DoWork);
myThread.Start();

また、ThreadStart デリゲート オブジェクトを作成する必要があると自動的に推測されます。

于 2012-12-28T19:44:38.150 に答える
1

どちらも同じです。

最初の例では、スレッドコンストラクターmyThreadDelegateに渡される以外の使用法はありません。

于 2012-12-28T20:23:04.917 に答える
1

確かに、2 番目の方法に単純化できます。ただし、デバッグ中に他のオブジェクトが必要になった場合、それらは使用できません。彼らがそうする可能性は低いですが、より簡潔な行を作成することには常にその欠点があることに注意してください.

于 2012-12-28T19:44:40.860 に答える
1

はい、できます。

デリゲートが新しい Thread() メソッドへの参照として渡されるためだけに使用される場合、そのシーケンスはそのように最適化される可能性があります。つまり、オブジェクト宣言が 1 つ少なくなります。

于 2012-12-28T19:45:30.293 に答える
0

OK、誰かがこれを提案しましたが、彼/彼女の答えを削除しました:

Thread myThread = new Thread ( () => Work.Dowork() );

そのことはラムダ式と呼ばれます。

于 2012-12-28T19:53:51.853 に答える