Как отменить регистрацию анонимного обработчика? - PullRequest
4 голосов
/ 24 февраля 2009

C # 2.0 имеет удобную функцию, называемую анонимными функциями. Это предназначено для использования в основном с событиями:

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

Теперь предположим, что Button является статическим членом, и добавление в него делегатов будет считаться неуправляемым ресурсом. Обычно я должен был бы отменить регистрацию обработчика, прежде чем повторно вводить его заново. Это довольно распространенный вариант использования для программирования GUI.

Каковы рекомендации с анонимными функциями? Фреймворк автоматически отменяет регистрацию? Если да, то когда?

Ответы [ 2 ]

9 голосов
/ 24 февраля 2009

Нет, анонимные функции не будут автоматически отменяться. Обязательно сделайте это самостоятельно, если событие не должно быть подключено в течение всего срока службы вашего приложения.

Для этого вам, конечно, нужно сохранить ссылку на делегат, чтобы иметь возможность отменить ее регистрацию. Что-то вроде:

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

Button.Click -= handler;

Также см. этот вопрос .

2 голосов
/ 24 февраля 2009

Если я правильно помню (и могу вспомнить, где я это читал), встроенные анонимные делегаты удалить нельзя.

Вам необходимо присвоить (статическое) поле делегата.

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

myButton.Click += myhandler;
...
myButton.Click -= myHandler;
...