Dieser schnelle Rat wurde zu einer langen Antwort. Es tut uns leid.
Wie Tyler in seiner netten Antwort betonte, ist das Aufrufen Dispose()eine großartige Programmierpraxis. Dies liegt daran, dass diese Methode alle erforderlichen Ressourcen freisetzen soll, damit keine nicht benötigten offenen Ressourcen vorhanden sind. Wenn Sie beispielsweise Text in eine Datei geschrieben haben und die Datei nicht schließen konnten (die Ressource freigeben), bleibt sie geöffnet, und niemand anderes kann darauf schreiben, bis der GC vorbeikommt und das tut, was Sie haben sollten getan.
In einigen Fällen wird es nun "Finalisierungs" -Methoden geben, die spezifischer für die Klasse sind, mit der Sie sich befassen, z. B. StreamWriter.Close()die überschrieben werden TextWriter.Close(). In der Tat sind sie normalerweise besser für die jeweilige Situation geeignet: Ein StreamWriter Close()beispielsweise spült den Stream und den zugrunde liegenden Encoder, bevor Dispose()das Objekt bearbeitet wird ! Cool!
Beim Durchsuchen von MSDN werden Sie jedoch feststellen, dass selbst Microsoft manchmal durch die Vielzahl von Schließern und Entsorgern verwirrt ist. Auf dieser Webseite wird zum Beispiel in einigen Beispielen Close()vor dem Impliziten aufgerufen Dispose()(siehe using-Anweisung, wenn Sie nicht verstehen, warum es implizit ist), und in einem Fall kümmern sie sich insbesondere nicht darum. Warum sollte das so sein? Auch ich war ratlos.
Der Grund, warum ich dachte (und ich betone, dies ist eine originelle Forschung und ich könnte sicherlich den Ruf verlieren, wenn ich mich irre), ist, dass dies Close()fehlschlägt und eine Ausnahme ergibt, während Ressourcen offen bleiben, während Dispose()sie sicherlich befreit werden . Weshalb ein Dispose()sollten immer einen wahren Close()Anruf (sorry für das Wortspiel).
MyResource r = new MyResource();
try {
r.Write(new Whatever());
r.Close()
finally {
r.Dispose();
}
Und ja, ich denke, Microsoft ist auf dieses eine Beispiel gestoßen. Vielleicht würde dieser Zeitstempel niemals in die Datei geschrieben werden.
Ich repariere morgen meinen alten Code.
Bearbeiten: Entschuldigung Brannon, ich kann Ihre Antwort nicht kommentieren, aber sind Sie sicher, dass es eine gute Idee ist, anzurufen Close() einen finallyBlock ? Ich denke, eine Ausnahme davon könnte den Rest des Blocks ruinieren, der wahrscheinlich wichtigen Bereinigungscode enthalten würde.
Antwort an Brannon's: Großartig, vergessen Sie nicht, anzurufen, Close()wenn es wirklich benötigt wird (z. B. beim Umgang mit Streams - Sie wissen nicht viel über SQL-Verbindungen in .NET).