Dispose паттерн
От: Аноним  
Дата: 09.12.13 15:02
Оценка:
Какой-то он мутноватый и имхо бездумно используемый.

Возьмём например System.Web.Mvc.Controller, там реализация по книжке:
        public void Dispose()
        {
            Dispose(true /* disposing */);
            GC.SuppressFinalize(this);
        }

        protected virtual void Dispose(bool disposing)
        {
        }


Вот только проблема — финаллизатор не определён и Dispose(false) никогда не вызывается. Т.е. получается наследник, содержащий неуправляемые ресурсы, должен всё равно реализовать финализатор и вызвать в нём Dispose?

С другой стороны есть и адеквактные реализации паттерна с финализатором в базовом классе — например, тот же Stream или SafeHandle. Несмотря на то что сами классы неуправляемых ресурсов не содержат, они реализуют финализатор и в нём дёргают Dispose(false).

Самое интересное, неувязка тянется с http://msdn.microsoft.com/en-us/library/b1yfkh5e%28v=vs.110%29.aspx. Там сначала звучит здравая мысль:

CONSIDER implementing the Basic Dispose Pattern on classes that themselves don’t hold unmanaged resources or disposable objects but are likely to have subtypes that do.

И потом сразу же идёт пример реализации без финализатора в базовом классе.

Какой-то странный паттерн получается, если необходимость определения финаллизатора в наследниках и вызова Dispose(false) неопределёна.
Лично я всегда пишу просто virtual void Dispose(), поскольку никогда использовать неупраляемые ресурсы вне SafeHandle не приходилось. А вы Dispose паттерн используете?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.