Подтвердить что ты не робот

EventHandlers и класс С# деструктор/Dispose

Я немного запутался в классах С# и их деконструкторе.

Мне нужно использовать несколько обработчиков событий в экземпляре класса, который я получаю в конструкторе:

 public Foo(IFooHandler handler)
 {
     handler.Load += Load;
     handler.Close += Close;
 }

Мне нужно отказаться от подписки на это событие, когда класс Foo будет уничтожен. Выполнять ли я IDisposable и отменять подписку там или в деконструкторе? Мне нужно уничтожить эти события, я не могу сделать это по-другому.

Для одного из классов я создаю экземпляр, проверяю ход выполнения, а затем экземпляр класса выходит из области видимости. Для другого он остается в MainForm, пока форма не будет закрыта. Во-первых, это то, о чем я беспокоюсь, потому что у него все еще есть ссылка на этот обработчик событий, а не на правильную работу.

Я не хочу утечки памяти. Когда и как я должен отказаться от подписки?

4b9b3361

Ответ 1

Не делайте этого в деструкторе, потому что он не будет вызываться во время присоединения обработчиков событий: когда вы присоединяете метод экземпляра Foo в качестве обработчика события Bar, Bar будет содержать ссылку на Foo, поэтому Foo не будет собирать мусор, и его деструктор не будет вызван.

Вы должны реализовать IDisposable и явно запретить свой объект

public void Dispose()
{
    if (handler != null)
    {
        handler.Load -= Load;
        handler.Close -= Close;
    }
}

Ответ 2

Если вам когда-либо приходится сталкиваться с проблемой того, что класс A является долгоживущим классом и классами B, то это короткоживущие, которые подписываются на события класса A, тогда вас, вероятно, будет интересовать Слабый шаблон события. Это может быть проблема, которую вы не обнаруживаете, до тех пор, пока не будет поздно, то есть Принстонский автопроизводитель.