0
Thread1.WorkerReportsProgress = true;  
Thread1.ProgressChanged += new ProgressChangedEventHandler(Function2HandleWhenProgressChanges); //When progress changes, define a function to handle  it.
Thread1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(Function2HandleWhenThreadIsFinished); //The function to run when the thread is finished
Thread1.DoWork += new DoWorkEventHandler(Thread1_DoWorkDo); //The function defining what the thread must do.

これで、ProgressChangedEventHandler がデリゲートであることを理解しました。次に、デリゲートはクラスになります。

1.「ProgressChangedEventHandler」はどのクラスに属しますか? 私のコードでは何も定義していません。

2.「ProgressChanged」はイベントですか? もしそうなら、これはどのクラスに属しますか?

3. 「new ProgressChangedEventHandler」を指定しない場合でも、コードはコンパイルされますか?. 以下のようなもの。

 Thread1.WorkerReportsProgress = true;  
 Thread1.ProgressChanged += Function2HandleWhenProgressChanges; //When progress changes,  define a function to handle  it.
 Thread1.RunWorkerCompleted += Function2HandleWhenThreadIsFinished; //The function to run when the thread is finished
 Thread1.DoWork += Thread1_DoWorkDo; //The function defining what the thread must do.
4

3 に答える 3

4

1)誰のものでもありません。これは、.NETFrameworkで個別に定義されたタイプです。

2)そうです。これはクラスで定義されます(F1キーを押してMSDNで検索するか、クラスBackgroundWorkerのインスタンスで呼び出すことで確認できます)BackgroundWorker

3)シンタックスシュガーです。コンパイラは、タイピングを減らすのに役立ちます。

「eventsanddelegates.net」をグーグルで検索すると、非常に優れた説明がたくさん表示されます。

于 2012-09-20T08:24:14.833 に答える
1

次に、デリゲートはクラスになります。

クラスではなく、です。これは、これらの他の質問をする理由を説明しています。メソッドの型記述と考えてください。戻り値の型と引数は重要です。デリゲート型は、コンパイラが適切な種類のイベント ハンドラー メソッドを確実に割り当てるのに役立ちます。メソッドには、デリゲート型とまったく同じ戻り値の型と引数が必要です。そうでない場合、コンパイラは文句を言います。この種のタイプ セーフは、.NET では非常に重要です。

「ProgressChangedEventHandler」はどのクラスに属しますか?

クラスではなくデリゲート型です。.NET フレームワークで宣言されています。System.dll への参照を追加しusing System.ComponentModel、プログラムの先頭に配置すると、完全な型名をスペルアウトせずに使用できます。

「ProgressChanged」はイベントですか?

はい、BackgroundWorker クラスのイベントです。DoWork と RunWorkerCompleted に加えて、ほとんどの場合、他の 2 つのイベントをサブスクライブします。

「new ProgressChangedEventHandler」を指定しない場合でも、コードはコンパイルされますか?.

それは「シンタックスシュガー」と呼ばれます。C# コンパイラは、イベントの種類から必要なデリゲートの種類を判断し、必要に応じてステートメントの "新しい ProgressChangedEventHandler" 部分を自動的に生成します。とても便利。ただし、IntelliSense は常にそれを生成します。完全なステートメントでさえ構文糖衣であり、Delegate.Target プロパティを明示的に割り当てることはありません。ターゲット メソッドが静的かどうかに応じて、コンパイラによって null またはthisのいずれかに推論されます。

于 2012-09-20T09:04:28.037 に答える
1

あなたの質問に対する簡単な答えは次のとおりです。

  1. イベント ハンドラー オブジェクトは、必ずしもどのクラスにも属していません。他のオブジェクトと同様に、フレームワーク内で適切な名前空間が定義されます。デリゲートは、クラスを定義できる場所であればどこでも定義できるため、名前空間に配置したり、別のクラスの内部にネストしたりできます。場所は、何が理にかなっているかにのみ依存します。特定の例では、名前空間にProgressChangedEventHandler属しており、別のクラス内にネストされていません。System.ComponentModel

  2. はい、名前空間ProgressChangedの一部でもあるイベントで。System.ComponentModel

  3. はい、その速記は機能します。比較している 2 つの形式は、一般的に同じ表記法と見なされ、同じ IL にコンパイルされるため、必要に応じて自由に使用してください。約1週間前にまったく同じ質問があったので、実際にはこの表記法について議論する良いSOの質問があります

于 2012-09-20T08:31:19.860 に答える