1

System.Windows.Form.Formから派生した「MyForm」があります。MyFormは、コンストラクターでハンドラーを設定したFormClosedイベントを処理します。インスタンス化されたMyFormオブジェクトが-=を使用してMyClass#FormClosedハンドラーを正常に削除することは可能ですか?それが重要な場合は、匿名メソッドを使用してFormClosedイベントをワイヤリングしています。

// In MyForm Constructor, this ALWAYS gets fired...
FormClosed += (_sender, _args) => { m_mutex.Dispose(); m_mutex = null; };

// In Instantiating Class
MyForm form = new MyForm();
form.FormClosed += (_sender, _args) => {  };

// I have also tried using "delegate(object sender, EventArgs e)" and neither worked.
4

2 に答える 2

3

はい、削除できますが、匿名関数を使用した場合は少し注意が必要です。

基本的に、無名関数の使用を停止する(つまり、動作をメソッドに入れる)、デリゲートの値を格納するためのフィールドが必要になります

private EventHandler formClosedHandler;
...

// In constructor
formClosedHandler = (sender, args) => { ... };
FormClosed += formClosedHandler;

// Later...
FormClosed -= formClosedHandler;
formClosedHandler = null;

個人的には、何らかの理由で本当にトリッキーでない限り、ロジックをメソッドに移動することをお勧めします。

于 2011-07-12T15:18:48.703 に答える
0

はい、Disposed()メソッド内であっても、どのイベントからも退会できます。

于 2011-07-12T15:20:19.530 に答える