que debe seguir el patrón convencional para implementar Dispose
. Hacer Dispose()
virtual se considera mala práctica, porque el patrón convencional enfatiza la reutilización del código en "limpieza administrada" (cliente API llamando al Dispose()
directamente o por using
) y "limpieza no gestionada" (finalizador de llamadas del GC). Para recordar, el patrón es la siguiente:
public class Base
{
~Base()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this); // so that Dispose(false) isn't called later
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
// Dispose all owned managed objects
}
// Release unmanaged resources
}
}
clave aquí es que no hay duplicación entre finalizador y Dispose
para la limpieza no administrado, y sin embargo ninguna clase derivada puede extender tanto la limpieza administrado y no administrado.
Para su caso, lo que debe hacer es lo siguiente:
protected abstract void Dispose(bool disposing)
y dejar todo lo demás como es. Incluso eso tiene un valor dudoso, ya que ahora aplica sus clases derivadas para implementar Dispose
, y ¿cómo sabe que todas las necesitan? Si su clase base no tiene nada que desechar, pero es probable que la mayoría de las clases derivadas sí lo hagan (con algunas excepciones), simplemente proporcione una implementación vacía. Es lo que hace System.IO.Stream
(sí mismo abstracto), entonces hay un precedente.
¿Por qué necesita agregar Dispose() a su interfaz? Si se hereda de IDisposable, el método Dispose() ya es parte de su interfaz. –
Seth, debe implementar todos los miembros de la interfaz. Salirlo no compilaría. –