WinForms и обработчики событий - PullRequest
2 голосов
/ 05 января 2012

По умолчанию, когда вы создаете приложение Win-Form, это код, сгенерированный Visual Studio для утилизации формы.

protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

Достаточно ли этого? Или я должен отменить регистрацию всех событий, чтобы элементы управления были готовы для сбора сборщиком мусора?

        if (disposing && (components != null))
        {
            myButton.OnClick-= MyFunction; //may be here!!
            // ... all events used
            components.Dispose();

        }

Ответы [ 3 ]

3 голосов
/ 05 января 2012

Форма должна отменить регистрацию всех событий от сущностей, которые переживут форму.Не имеет значения, если форма отменяет регистрацию событий от сущностей, которые имеют то же время жизни, что и форма.По какой-то причине нормальная доктрина кажется «не волнуйтесь о незарегистрированных событиях, кроме случаев, когда это важно».Я бы подумал, что было бы намного чище, чтобы все объекты, подписывающиеся на события, отписывались от них на Dispose, но, к сожалению, ни vb.net, ни C # не предоставляют даже хотя бы удаленно чистых способов сделать это.С зависимостями, которые реализуют IDisposable, можно обернуть конструкцию в подпрограмму, которая добавит вновь созданный элемент в список вещей, которые будут очищены позже.Затем можно выполнить всю необходимую очистку, просто вызвав Dispose для всего списка.К сожалению, с точки зрения .net, нет хорошего способа написать процедуру общего назначения, которая будет одновременно подписываться на событие и возвращать Action<>, IDisposable или другой такой объект, который можно использовать для отмены подписки.

0 голосов
/ 05 января 2012

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

0 голосов
/ 05 января 2012

Если эта форма часто подвергается close and open операциям и использует огромное количество событий внутри нее, важно , чтобы отменить регистрацию всех событий .События Cuase потребляют ресурсы определенно.

Если это форма, которая появляется некоторое время, или может даже не появиться никогда, или это, скажем, ваше приложение MainForm, не важно отписаться от событий.

Как насчет place, где это сделать, я бы лично отписался внутри, скажем, внутри Closing переопределить и не в Dispose().

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