Должен ли я отписаться от всех обработчиков событий? - PullRequest
10 голосов
/ 27 августа 2009

Допустим, что в Designer в VS вы дважды щелкаете по кнопке, и она генерирует этот обработчик события Click.

код подписки находится в designer.cs.

Мне было интересно, в расположении формы ДОЛЖЕН ли я отписать событие?

Кроме того, весь контроль, который находится в форме, будет удален, когда формы будут уничтожены? это на самом деле вызывает dispose для каждого элемента управления рекурсивно?

Ответы [ 3 ]

15 голосов
/ 27 августа 2009

Вам не нужно отсоединять событие в Dispose, если вы подключаете свое собственное событие.

Вам нужно беспокоиться об этом, только если вы перехватываете событие в другом объекте. Причина этого заключается в том, что перехватчики событий поддерживают связь с подписчиком. Если вам не удастся отцепить, вы не будете собирать мусор, пока наблюдаемое еще живо.

Когда вы подключаете свое собственное событие, у вас есть ссылка на себя, которая является круглой, поэтому вам не нужно беспокоиться об этом.

По этой причине я пришел поддержать более слабосвязанные шаблоны событий. Это первое место по утечке памяти в .Net. Я предпочитаю шаблон Event Aggregator слабыми событиями ).

2 голосов
/ 27 августа 2009

На вопрос «будет ли он рекурсивно вызывать dispose для каждого элемента управления?», Ответ - да.

Простой тест можно выполнить, поместив точку останова в метод Dispose элемента управления.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.Controls.Add(new SuperButton());
    }
}

public class SuperButton : Button
{
    protected override void Dispose(bool disposing)
    {
        //Place breakpoint on the line below
        base.Dispose(disposing); 
    }
}
1 голос
/ 27 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...