4

C# 2.0 には、無名関数と呼ばれる便利な機能があります。これは、主にイベントで使用することを目的としています。

Button.Click += delegate(System.Object o, System.EventArgs e)
                   { System.Windows.Forms.MessageBox.Show("Click!"); };

ここで、Button が静的メンバーであると仮定すると、それにデリゲートを追加すると、管理されていないリソースとしてカウントされます。通常、ハンドラーを再登録する前に、ハンドラーの登録を解除する必要があります。これは、GUI プログラミングの非常に一般的な使用例です。

匿名関数のガイドラインは何ですか? フレームワークは自動的に登録解除しますか? もしそうなら、いつ?

4

2 に答える 2

9

いいえ、匿名関数は自動的に登録解除されません。アプリケーションの存続期間全体にわたってイベントをフックしないようにする場合は、必ず自分で行う必要があります。

もちろん、これを行うには、デリゲート参照を保存して、登録を解除できるようにする必要があります。何かのようなもの:

EventHandler handler = delegate(System.Object o, System.EventArgs e)
               { System.Windows.Forms.MessageBox.Show("Click!"); };
Button.Click += handler;
// ... program code

Button.Click -= handler;

また、この質問を参照してください。

于 2009-02-24T18:13:34.217 に答える
2

正しく思い出せば(そしてこれを読んだ場所を思い出せれば)、インラインの匿名の代理人を削除することはできません。

(静的)デリゲートフィールドに割り当てる必要があります。

private static EventHandler<EventArgs> myHandler = (a,b) => { ... }

myButton.Click += myhandler;
...
myButton.Click -= myHandler;
于 2009-02-24T18:13:52.843 に答える