Должен ли я отказаться от подписки на все обработчики событий?

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

код подписки находится в файле designer.cs.

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

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

Ответ 1

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

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

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

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

Ответ 2

В вопросе "будет ли он фактически вызывать на каждом управлении рекурсивно?", ответ "да".

Простой тест можно выполнить, поставив точку останова в методе 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); 
    }
}

Ответ 3

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