Mentre tutti hanno menzionato risorse (non gestite), ho un'altra cosa da aggiungere: la uso quando ho bisogno di eliminare i collegamenti del gestore di eventi che altrimenti impedirebbero a una classe di uscire dal campo di applicazione e di essere spazzata via.
Ad esempio, ho un servizio che viene iniettato in una vista figlio, quella vista figlio si iscriverà a vari eventi di tipo finito asincrono sul servizio. Il proprietario di quella vista figlio non ha idea di quale sia il tipo concreto, ha semplicemente come interfaccia. In futuro il servizio potrebbe non essere più disponibile in alcun punto arbitrario, e non voglio che non funzioni in GC. Dopo aver eliminato quella vista secondaria, il proprietario chiamerà Dispose su di essa per dargli la possibilità di sganciare qualsiasi gestore di eventi. Ecco un esempio leggermente forzato (e molto pseudo codice), si noti come l'interfaccia per la vista figlio implementa anche 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 ...
}
ci sono di gran lunga più autorevoli commenti su questo dagli altri su SO, come Do event handlers stop garbage collection from occuring? e Garbage collection when using anonymous delegates for event handling. Si consiglia inoltre di controllare questo articolo codeproject.
@Earwicker: Se hai trovato più di quello che ho fatto su quell'argomento, allora mi piacerebbe che tu lo condividessi con me. – Bobby
http://stackoverflow.com/search?q=IDisposable+owner –