Ja, Disposewird angerufen. Es wird aufgerufen, sobald die Ausführung den Bereich des usingBlocks verlässt , unabhängig davon, welche Mittel zum Verlassen des Blocks erforderlich waren, sei es das Ende der Ausführung des Blocks, eine returnAnweisung oder eine Ausnahme.
Wie @Noldorin richtig hervorhebt, wird die Verwendung eines usingBlocks im Code in try/ kompiliert finally, Disposewobei im finallyBlock aufgerufen wird . Zum Beispiel der folgende Code:
using(MemoryStream ms = new MemoryStream())
{
//code
return 0;
}
effektiv wird:
MemoryStream ms = new MemoryStream();
try
{
// code
return 0;
}
finally
{
ms.Dispose();
}
Da finallydie Ausführung garantiert ist, nachdem der tryBlock die Ausführung beendet hat, wird unabhängig von seinem Ausführungspfad Disposegarantiert, dass er aufgerufen wird, egal was passiert.
Weitere Informationen finden Sie in diesem MSDN-Artikel .
Nachtrag:
Nur eine kleine Einschränkung: Da Disposeder Aufruf garantiert ist, ist es fast immer eine gute Idee, sicherzustellen, dass Disposebei der Implementierung niemals eine Ausnahme ausgelöst wird IDisposable. Leider gibt es einige Klassen in der Kernbibliothek, die unter bestimmten Umständen auslösen, wenn sie Disposeaufgerufen werden - ich sehe Sie an, WCF-Dienstreferenz / Client-Proxy! - und wenn dies passiert, kann es sehr schwierig sein, die ursprüngliche Ausnahme aufzuspüren, wenn Disposesie während eines Abwickelns des Ausnahmestapels aufgerufen wurde, da die ursprüngliche Ausnahme zugunsten der neuen Ausnahme verschluckt wird, die durch den DisposeAufruf generiert wird . Es kann unglaublich frustrierend sein. Oder ist das frustrierend verrückt? Einer der Beiden. Vielleicht beide.