Der Zweck der using
Aussage ist Dispose
auf ein Objekt aufzurufen das implementiert IDisposable
. Der manuelle Weg, dies zu tun ist eine try...finally
Aussage, aber das ist viel hässlicher.
Beim Verlassen der Funktion wird Dispose
nicht aufgerufen. Die lokale Variable verlässt den Gültigkeitsbereich und verweist nicht mehr auf das Objekt. Dass ein Objekt keine Referenzen mehr hat, verursacht keine sofortige Reaktion. Es bedeutet nur, dass der GC von nun an sammeln kann.
So werden die nativen Ressourcen verweilen, bis der GC sie sammelt, möglicherweise viel später. Oder wenn es andere Verweise auf dieses Objekt gibt, die innerhalb von Dispose
entfernt worden wären, würde es möglicherweise gar nicht erfasst.
Using statement in the VB.net specification
Und in C# (VB.net sehr ähnlich sein sollte) using
auf einem Referenztyp entspricht:
{
ResourceType resource = expression;
try {
statement;
}
finally {
if (resource != null) ((IDisposable)resource).Dispose();
}
}
Wie Sie die finally
kümmert telefonieren sehen, egal entsorgen, was passiert, in statement
. Schließlich wird ausgeführt, auch wenn Sie die Funktion beenden oder eine Ausnahme auslösen.
Nur ein paar katastrophale Fehler wie OutOfMemory, StackOverflow und erzwungene Entladen der App-Domäne wird es nicht ausführen.
Ich habe nie in .NET programmiert, aber ich kenne die Antwort, weil das Thema dreimal pro Woche kommt. Kennt der durchschnittliche .NET-Programmierer etwas über seine Sprache? – delnan