Распоряжение Объектами с долгоживущими зависимостями - PullRequest
0 голосов
/ 24 марта 2010
public class ABC
{
    public ABC(IEventableInstance dependency)
    {
        dependency.ANewEvent += MyEventHandler;
    }

    private void MyEventHandler(object sender, EventArgs e)
    {
        //Do Stuff
    }
}

Скажем, экземпляр ABC - это долгоживущий объект, а моя зависимость - еще более продолжительный объект. Когда нужно очистить экземпляр ABC, у меня есть два варианта.

Один, у меня может быть метод Cleanup (), чтобы отписаться от события ANewEvent, или я мог бы реализовать IDisposable, а в Dispose развернуть событие. Теперь я не могу контролировать, будет ли потребитель вызывать метод dispose или даже метод Cleanup, если я пойду по этому пути.

Должен ли я внедрить Финализатор и отказаться от подписки? Там грязно, но я не хочу, чтобы вокруг висели экземпляры ABC.

Мысли

Ответы [ 2 ]

1 голос
/ 16 февраля 2011

Очевидное решение этой проблемы, после того как я оставил этот вопрос в течение года, состоит в том, что я должен реализовать IDisposable и просто отписаться от события в моем Dispose ().

Поскольку я не несу ответственности за время существования зависимости, я не должен ничего с ней делать.

1 голос
/ 25 марта 2010

Я прочитал это на MSDN :

Поскольку метод Dispose должен быть явно, объекты, которые реализовать IDisposable должны также реализовать финализатор для обработки освобождение ресурсов при утилизации называется . По умолчанию мусор Коллектор автоматически вызывает финализатор объекта до восстановления его память. Тем не менее, после утилизации метод был вызван, это как правило, ненужный для мусора коллектор, чтобы позвонить распоряжаться финализатор объекта. Предотвращать автоматическое завершение, удаление реализации могут вызывать Метод GC.SuppressFinalize.

Таким образом, чтобы быть в безопасности в этом случае, я бы реализовал как IDisposable, так и финализатор. И я согласен, это немного грязно, но опять же, это цена, которую вы платите, имея дело с объектами с длительным сроком службы.

...