Sì, Disposeverrà chiamato. Viene chiamata non appena l'esecuzione lascia l'ambito del usingblocco, indipendentemente dal mezzo impiegato per abbandonare il blocco, che si tratti della fine dell'esecuzione del blocco, di returnun'istruzione o di un'eccezione.
Come sottolinea correttamente @Noldorin, l'utilizzo di un usingblocco nel codice viene compilato in try/ finally, con Disposeessere chiamato nel finallyblocco. 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 tryblocco 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 Disposenon 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 Disposeviene chiamato - Sto guardando voi, WCF Service Reference / Proxy Client! - e quando ciò accade può essere molto difficile rintracciare l'eccezione originale se è Disposestata chiamata durante uno svolgimento dello stack di eccezioni, poiché l'eccezione originale viene inghiottita a favore della nuova eccezione generata dalla Disposechiamata. Può essere frustrante in modo esasperante. O è frustrantemente esasperante? Uno dei due. Forse entrambi.