Si bien todos mencionaron recursos (no administrados), tengo otra cosa que agregar: la utilizo cuando necesito eliminar conexiones de controladores de eventos que de otra manera evitarían que una clase saliera del alcance y se recolectara basura.
Como ejemplo, tengo un servicio que se inyecta en una vista secundaria, esa vista secundaria se suscribirá a varios eventos de tipo asincrónico 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 mucho más autorizada comentarios sobre este de los demás en SO, como Do event handlers stop garbage collection from occuring? y Garbage collection when using anonymous delegates for event handling. También puede consultar este artículo codeproject.
@Earwicker: Si has encontrado más que yo sobre ese tema, te agradecería que me lo compartieras. – Bobby
http://stackoverflow.com/search?q=IDisposable+owner –