Какой-то он мутноватый и имхо бездумно используемый.
Возьмём например
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 паттерн используете?