new キーワードを使用してイベントにデリゲートを追加しても安全ですか?

StackOverflow https://stackoverflow.com/questions/99790

  •  01-07-2019
  •  | 
  •  

質問

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

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

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

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

#2 を行うメリットは何ですか?

役に立ちましたか?

解決

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

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

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

他のヒント

1 番目は、2 番目と同じ MSIL を生成する単なる省略表現で、コンパイル タイプで this.Handle を調べ、インスタンス化するデリゲートを推測します。ただし、新規を使用して購読を解除しないでください。

したがって、この 2 つに違いはなく、コードをすっきりさせるための構文上の糖衣があるだけです。

2 は単なる構文糖であるという印象を受けました。彼らはする必要があります その通り 同じこと。

私の記憶が正しければ、最初の選択肢は 2 番目の選択肢に対する単なる構文上の糖衣です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top