#c_sharp #net
Доброго времени суток! У меня есть такой вопрос. Допустим, у меня есть класс, реализующий интерфейс IDisposable. У этого класса есть какой-то управляемый ресурс, который тоже реализует этот интерфейс. Вот минимальный код моего класса. class MyClass : IDisposable { private SomeContext _context = new SomeContext(); public void Dispose() { if(_context != null) _context.Dispose(); } } И тут у меня возник вопрос. Насколько правильна эта реализация? Точнее насколько она неправильна и чем это грозит? (везде где смотрел я видел более сложную реализацию Dispose паттерна). Вроде бы имеется всего одно IDisposable поле (предполагается что оно корректно реализует этот паттерн в своих внутренностях), и чтобы освободить ресурс корректно, достаточно просто в нужное время вызвать метод Dispose для поля _context. В чем я не прав? Применима ли такая простая реализация на практикке и чем она вообще плоха?
Ответы
Ответ 1
Да, в этой схеме всё верно. Неуправляемых ресурсов нет, финализатор не нужен. Dispose вызов прокидывает дальше, т. е. своё дело делает. А вообще, рекомендую почитать: http://sergeyteplyakov.blogspot.ru/2011/09/dispose-pattern.html, особенно раздел Упрощенная версия Dispose паттерна, который очень похож на этот вопрос.Ответ 2
Всё правильно, но можно убрать проверку на null. Если класс сконструировался, то _context не равно null, т. к. new не может вернуть null. Итого: class MyClass : IDisposable { SomeContext _context = new SomeContext(); public void Dispose() => _context.Dispose(); } Обратите внимание, иногда уместно использовать такую конструкцию: class MyClass : IDisposable { bool isDisposed = false; void EnsureSelfAlive() { if (isDisposed) throw new ObjectDisposedException(); } SomeContext _context = new SomeContext(); public void Dispose() { isDisposed = true; _context.Dispose(); } } и в каждом публичном методе в начале вызывать EnsureSelfAlive(). Позволяет отлавливать какое-то количество ошибок. Проверять isDisposed в Dispose не нужно, т. к. _context должен уметь «пережить» множественные вызовы _context.Dispose().
Комментариев нет:
Отправить комментарий