0

通常、匿名イベント ハンドラーは次のように解放できます。

    EventHandler hdl = null;
    hdl += (ss,ee) =>
    {
       //....
       MyObj.Completed -= hdl;            
       hdl = null;
    };

    MyObj.Completed += hdl;            
    MyObj.AsyncCall();

私の質問は: hdl = null;C# の最新バージョンには必要ですか? また、このリリースのより単純な解決策またはより単純な構文はありますか?

4

2 に答える 2

0

いくつかのこと:

  1. MyObj.Completedは引き続きハンドラーへの参照を保持するため、設定するだけhdl = nullではガベージコレクション用にハンドラーが解放されません。(ただしMyObj.Completed -= hdl、この場合は処理するので、問題ないはずです。)
  2. +=hdlへの割り当てに使用する必要はありません。単純な割り当てを使用する必要があります=
  3. 代わりに、ラムダが名前付きメソッドである場合は、とを使用できMyObj.Completed += MyCallbackNameますMyObj.Completed -= MyCallbackName。クロージャーでキャプチャしたものが必要な場合、これは機能しませんが、あなたの例からはわかりません。
于 2012-08-14T19:14:00.570 に答える
0

いいえ、必須ではありません。これは基本的にすべてキャプチャコンテキスト(コンパイラで生成されたクラス)に関連付けられています。イベントのサブスクライブが解除されると、キャプチャコンテキストのスコープを維持するものがなくなるため、ガベージコレクションの対象になります。hdl変数(実際にはキャプチャコンテキストのフィールド)をワイプするメリットはありません(ただし、実際に害はありません)。

于 2012-08-14T19:14:11.630 に答える