Lokaler Objekt-Scope unter .NET am Beispiel StreamWriter
Frank Dzaebel, erstellt am: 26.11.2005, zuletzt geändert: 2.3.2006
Kategorie: Implementation, .NET-Version: 1.1/2.0
Lokal definierte Variablen werden unter .NET automatisch freigegeben.
[MSDN: Automatische Speicherverwaltung]
Aber Achtung. Die CLR kann die Objekte (zugeordneten Speicher der Variaben) "einige Zeit" festhalten.
Das heisst intern, dass das Objekt nur "zur Zerstörung freigegeben" ist, aber dieses noch nicht ausgeführt wurde. Deswegen können unten beschriebene Effekte entstehen:
string filepath = Path.Combine(Application.StartupPath, "Test.txt");
private void Form1_Load(object sender, System.EventArgs e)
{
Init();
// GC.Collect(); GC.WaitForPendingFinalizers(); //
<-wird diese Zeile aktiviert, tritt der Fehler nicht auf. File.Delete(filepath); //->
...System.IO.IOException...
Zusätzliche Informationen: Der Prozess kann nicht auf die Datei "D:\DotNet\FileWriteTest\bin\Debug\Test.txt" zugreifen, da sie von einem anderen Prozess verwendet wird.}
private void Init()
{
StreamWriter sw = new StreamWriter(filepath);
} // "sw" bleibt !OFFEN! (Zeitdauer unbestimmt) // Der Denkfehler: "da lokal, wird 'sw' automatisch geschlossen", dem ist nicht so.
Besser wäre ein sw.Close(); am Ende von Init().
Dies führt ein Flush() des StreamWriter's aus und gibt die Datei zur Verwendung wieder frei.