Ich weiß, das mag albern klingen, aber warum funktioniert der folgende Code nur, wenn ich die Datei schließe ()? Wenn ich die Datei nicht schließe, wird der gesamte Stream nicht geschrieben.
Schritte:
Sollte das Dateiobjekt nicht automatisch geleert oder geschlossen werden, wenn es den Gültigkeitsbereich verlässt? Ich bin neu in C #, aber ich bin es gewohnt, Aufrufe von Close () in C ++ - Destruktoren hinzuzufügen.
%Vor% C # hat keine automatische deterministische Bereinigung. Sie müssen die Bereinigungsfunktion aufrufen, wenn Sie steuern möchten, wann sie ausgeführt wird. Der using
-Block ist der gebräuchlichste Weg, dies zu tun.
Wenn Sie den Cleanup-Aufruf nicht selbst vornehmen, wird die Bereinigung durchgeführt, wenn der Garbage Collector entscheidet, dass der Speicher für etwas anderes benötigt wird, was sehr lange später sein könnte.
%Vor% BEARBEITEN: Wie Harvey hervorhebt, wird die Bereinigung zwar versucht, wenn das Objekt gesammelt wird, aber das ist keine Garantie für den Erfolg. Um Probleme mit Zirkelverweisen zu vermeiden, versucht die Laufzeitumgebung nicht, Objekte in der "richtigen" Reihenfolge zu finalisieren, sodass FileStream
tatsächlich bereits tot sein kann, wenn der StreamWriter
Finalizer ausgeführt wird und versucht, gepufferte Ausgaben zu löschen.
Wenn Sie mit Objekten arbeiten, die aufgeräumt werden müssen, tun Sie dies explizit, entweder mit using
(für lokal begrenzte Nutzung) oder durch Aufruf von IDisposable.Dispose
(für langlebige Objekte wie Referenten von Klassenmitgliedern).
Streams sind Objekte, die nicht müllgesammelte Ressourcen "verwalten" oder "behandeln". Sie (Streams) implementieren daher die IDisposable-Schnittstelle, die, wenn sie mit 'using' verwendet wird, sicherstellen wird, dass die nicht-Müll gesammelten Ressourcen aufgeräumt sind. versuche das:
%Vor%Ohne #Close können Sie nicht sicher sein, ob die zugrunde liegende Dateikennung ordnungsgemäß geschlossen wird. Manchmal kann dies beim Herunterfahren der App sein.
Weil Sie einen Streamwriter verwenden und der Puffer nicht gelöscht wird, bis Sie% cowe% des Writers haben. Sie können festlegen, dass der Writer bei jedem Aufruf von write gelöscht werden soll, indem Sie die Eigenschaft Close()
des streamwriter auf true setzen.
Sehen Sie sich die Dokumentation an. Ссылка
Wenn Sie in eine Datei ohne "Schließen" schreiben möchten, würde ich verwenden:
%Vor%Weil die C # -Designer trotz des Namens Java und nicht C ++ geklont haben.
Meiner Meinung nach haben sie das Boot wirklich vermisst. Die C ++ - Stilzerstörung beim Geltungsbereichsexit wäre so viel besser gewesen.
Es müsste nicht einmal den Speicher freigeben, um besser zu sein, einfach den Finalizer oder die IDisposable-Methode automatisch ausführen.