Sì, Dispose
verrà chiamato. Viene chiamata non appena l'esecuzione lascia l'ambito del using
blocco, indipendentemente dal mezzo impiegato per abbandonare il blocco, che si tratti della fine dell'esecuzione del blocco, di return
un'istruzione o di un'eccezione.
Come sottolinea correttamente @Noldorin, l'utilizzo di un using
blocco nel codice viene compilato in try
/ finally
, con Dispose
essere chiamato nel finally
blocco. Ad esempio il codice seguente:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
diventa effettivamente:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Quindi, poiché finally
è garantita l'esecuzione dopo che il try
blocco ha terminato l'esecuzione, indipendentemente dal suo percorso di esecuzione, Dispose
è garantito che venga chiamato, non importa cosa.
Per ulteriori informazioni, vedere questo articolo di MSDN .
Addendum:
Solo un piccolo avvertimento da aggiungere: poiché Dispose
è garantito che venga chiamato, è quasi sempre una buona idea assicurarsi che Dispose
non generi mai un'eccezione quando si implementa IDisposable
. Purtroppo, ci sono alcune classi nella libreria di base che fanno un tiro in determinate circostanze, quando Dispose
viene chiamato - Sto guardando voi, WCF Service Reference / Proxy Client! - e quando ciò accade può essere molto difficile rintracciare l'eccezione originale se è Dispose
stata chiamata durante uno svolgimento dello stack di eccezioni, poiché l'eccezione originale viene inghiottita a favore della nuova eccezione generata dalla Dispose
chiamata. Può essere frustrante in modo esasperante. O è frustrantemente esasperante? Uno dei due. Forse entrambi.