pattern - implements idisposable dispose c#
¿Cuándo debería implementar IDisposable? (6)
Creo que los documentos son bastante claros acerca de para qué IDisposable es bueno.
El uso principal de esta interfaz es liberar recursos no administrados. El recolector de basura libera automáticamente la memoria asignada a un objeto administrado cuando ese objeto ya no se usa. Sin embargo, no es posible predecir cuándo ocurrirá la recolección de basura. Además, el recolector de basura no tiene conocimiento de los recursos no administrados, como los identificadores de ventanas o los archivos y las secuencias abiertos.
Incluso tiene un ejemplo. En ese ejemplo, la clase que implementa IDisposable
contiene un identificador. Se debe liberar un controlador cuando ya no se usa. Esto se hace en el método Dispose()
. Por lo tanto, el usuario de esa clase ve que implementa IDisposable
y sabe que la clase debe eliminarse explícitamente cuando ya no se necesita (para que se pueda liberar el identificador). Es una buena práctica (es decir, una regla) que siempre deba llamar a Dispose()
en instancias IDisosable
cuando la instancia ya no es necesaria.
Esta pregunta ya tiene una respuesta aquí:
- Uso adecuado de la interfaz IDisposable 18 respuestas
¿Cuál es la mejor práctica para cuándo implementar IDisposable?
¿Es la mejor regla de oro para implementarlo si tiene un objeto gestionado en la clase, o depende si el objeto se creó en la clase o simplemente pasó? ¿Debo hacerlo también para las clases sin objetos administrados?
Cuando su clase contiene objetos no administrados, recursos, archivos abiertos u objetos de bases de datos, debe implementar IDisposable
.
Debe implementar IDisposable cuando su clase tenga recursos que quiera liberar cuando haya terminado de usarlos.
Si bien todos mencionaron recursos (no administrados), tengo otra cosa que agregar: la utilizo cuando necesito eliminar conexiones de controladores de eventos que, de otro modo, evitarían que una clase salga del alcance y se recopile basura.
Como ejemplo, tengo un servicio que se inyecta en una vista secundaria, esa vista secundaria se suscribirá a varios eventos de tipo finalización asíncrona en el servicio. El propietario de esa vista secundaria no tiene idea de cuál es el tipo concreto, simplemente lo tiene como una interfaz. El servicio puede quedar fuera del alcance en algún momento arbitrario en el futuro, y no quiero que se quede sin GC. Al deshacerse de esa vista secundaria, el propietario llamará a Dispose sobre ella para darle la oportunidad de desenganchar cualquier manejador de eventos. Aquí hay un ejemplo ligeramente artificial (y muy pseudocódigo), observe cómo la interfaz para la vista secundaria también implementa IDisposable
.
public class OwnerView {
public OwnerView() {
_childView = new ChildView(myServiceReference);
}
public void CloseChildView() {
if (childView != null) {
_childView.Close();
_childView.Dispose();
}
_childView = null;
}
private IChildView _childView;
}
public class ChildView : IChildView {
public ChildView(MyService serviceRef) {
_serviceRef = serviceRef;
_serviceRef.GetSettingsAsyncFinished += new EventHandler(someEventHandler);
}
public void IDisposable.Dispose() {
_serviceRef -= someEventHandler;
}
private MyService _serviceRef;
}
public interface IChildView : IDisposable {
void DoSomething();
... etc ...
}
Hay comentarios mucho más autorizados sobre esto de otros en SO, como ¿los manejadores de eventos detienen la recolección de basura? y recolección de basura cuando se usan delegados anónimos para el manejo de eventos . También puede consultar este artículo del proyecto de codeproject .
Si se refiere a objetos no administrados , entonces sí, debe implementarlo siempre que tenga uno o más recursos no administrados que esté manejando en su clase. También debe utilizar el patrón cuando posiblemente se aferre a objetos que pueden ser identificados por sí mismos, y asegúrese de desecharlos cuando se deshaga de su clase.
(Estoy de acuerdo en que esta pregunta ya se ha hecho las veces suficientes como para ejecutar una pequeña impresora sin tinta si se imprimen ...)
Si tiene propiedades que también deben eliminarse.