Warum muss ich eine Datei in C # schließen ()?

8

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:

  1. Führen Sie diesen Code beim Laden des Formulars aus.
  2. Schließen Sie das Formular mit der Maus, sobald es angezeigt wird.
  3. Programm wird beendet.

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%     
Harvey 15.10.2010, 17:41
quelle

6 Antworten

21

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).

    
Ben Voigt 15.10.2010, 17:44
quelle
8

Weil Write () gepuffert ist und der Puffer explizit von Close () geleert wird.

    
BlueDog 15.10.2010 17:43
quelle
3

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.

    
DevSolo 15.10.2010 17:44
quelle
2

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%     
EJC 15.10.2010 17:47
quelle
1

Schreiben des Betriebssystem-Caches an Block-Geräte, um dem Betriebssystem eine bessere Leistung zu ermöglichen. Sie erzwingen einen Schreibvorgang, indem Sie den Puffer nach einem Schreibvorgang löschen, indem Sie den Streamwriter auf autoflush setzen.

    
rerun 15.10.2010 17:44
quelle
-2

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.

    
Zan Lynx 15.10.2010 17:45
quelle

Tags und Links