6

私が懸念していることの 1 つは、デリゲートをイベントに登録する 2 つの方法を発見したことです。

  1. OnStuff += this.Handle;
  2. OnStuff += 新しい StuffEventHandler(this.Handle);

最初のものはきれいで、「OnStuff -= this.Handle;」を実行するのは理にかなっています。イベントから登録を解除するには...しかし、後者の場合、「OnStuff -= new StuffEventHandler(this.Handle);」を行う必要がありますか? 別の StuffEventHandler 参照を投入しているので、何も削除していないように感じます。イベントは参照によってデリゲートを比較しますか? ここで厄介なメモリプールを開始できるのではないかと心配しています。私を取得しますか?以前に登録した「新しい StuffEventHandler」への参照がありません。

#1を行うことの欠点は何ですか?

#2を行う利点は何ですか?

4

4 に答える 4

10

1 番目は、2 番目のものと同じ MSIL を生成する略記です。コンパイル タイプでは、this.Handle を見て、インスタンス化するデリゲートを推測します。ただし、new を使用して登録を解除しないでください。

したがって、2 つの間に違いはありません。コードをよりクリーンにするための構文糖衣だけです。

于 2008-09-19T05:11:55.643 に答える
6

最初に登録されたデリゲートへの参照を保持することを心配する必要はなく、「厄介なメモリ プール」を開始することもありません。

「OnStuff -= new StuffEventHandler(this.Handle);」を呼び出すと、削除コードは、参照によって削除するデリゲートを比較しませ。デリゲートが呼び出すターゲット メソッドへの参照を比較して等しいかどうかをチェックし、一致するデリゲートを "OnStuff" から削除します。

ちなみに、「OnStuff」自体はデリゲート オブジェクトです (宣言に含まれているイベント キーワードは、単にデリゲートのアクセシビリティを制限するだけです)。

于 2008-09-19T09:26:25.877 に答える
2

2 は構文糖衣に過ぎないという印象を受けました。それらはまったく同じものでなければなりません。

于 2008-09-19T05:11:43.693 に答える
1

私の記憶が正しければ、最初の選択肢は 2 番目の構文糖衣にすぎません。

于 2008-09-19T05:13:39.103 に答える