Using vs. Try-Finally
Teil des Abschnitts Logik & Ablauf der C#-Journey von Coddy — Lektion 28 von 66.
Sowohl using-Anweisungen als auch try-finally-Blöcke helfen beim Verwalten von Ressourcen, die ordnungsgemäß freigegeben werden müssen. Die using-Anweisung bietet eine sauberere, prägnantere Möglichkeit, sicherzustellen, dass IDisposable-Objekte ordnungsgemäß bereinigt werden.
Schauen wir uns zuerst einen try-finally-Ansatz an. Hier ist StreamReader eine Klasse, die Text aus einer Datei liest — sie hält einen offenen Datei-Handle, der eine Ressource ist, die freigegeben werden muss, wenn wir fertig sind:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
Der finally-Block garantiert, dass Dispose() aufgerufen wird, um den Datei-Handle freizugeben, auch wenn eine Ausnahme im try-Block auftritt.
Die using-Anweisung vereinfacht dieses Muster. Sie deklariert und initialisiert die Ressource in Klammern und ruft automatisch Dispose() auf, wenn der Block beendet wird — sei es normal oder aufgrund einer Ausnahme:
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
Das ist äquivalent zum obigen try-finally-Beispiel, aber mit weniger Boilerplate-Code.
Die using-Anweisung ruft automatisch Dispose() auf, wenn der Block beendet wird, auch wenn eine Ausnahme auftritt. Sie ersetzt das try-finally-Aufräumverfahren — nicht try-catch. Wenn Sie auch Ausnahmen behandeln müssen, können Sie einen using-Block weiterhin in einen try-catch einbetten.
Aufgabe
EinfachErstellen Sie eine Methode namens processFile, die:
- Nimmt einen Dateinamen als String-Parameter
- Verwendet die
using-Anweisung mit einemStreamReader, um alle Zeilen aus der Datei zu lesen - Gibt die Anzahl der Zeilen in der Datei zurück
- Falls eine
FileNotFoundExceptionauftritt, geben Sie "File not found" aus und geben Sie -1 zurück
Spickzettel
Die using-Anweisung bietet automatische Ressourcenbereinigung für IDisposable-Objekte und stellt sicher, dass Dispose() aufgerufen wird, auch wenn Ausnahmen auftreten. Sie ersetzt das ausführliche try-finally-Muster.
Try-finally-Ansatz:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
Using-Anweisung (saubererer Ansatz):
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
Beide Ansätze stellen sicher, dass Dispose() aufgerufen wird, wenn der Block beendet wird. Die using-Anweisung übernimmt dies automatisch und macht manuelle null-Prüfungen sowie den finally-Block überflüssig.
Wichtige Punkte:
• using ersetzt try-finally — nicht try-catch
• try-catch kann weiterhin mit using kombiniert werden, um Ausnahmen zu behandeln
• StreamReader liest Textdateien und implementiert IDisposable, was es ideal für die Verwendung mit using macht
Probier es selbst
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Schreibe deinen Code hier
}
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Multi-dimensional Arrays
2D Arrays BasicsDeclaring and Initializing 2DAccessing 2D Array ElementsNested Loops with 2D ArraysJagged ArraysCommon Matrix OperationsRecap - Multi-dimensional4Flow Control Techniques
Early ReturnsGuard ClausesJump Statements (goto)Break and ContinueFlatten Nested Conditionals7Logical Operators Advanced
Short-Circuit EvaluationConditional Logical OperatorsOperator PrecedenceRecap - Advanced Operators2Advanced Decision Making
Multiple ConditionsComplex Boolean LogicIf vs. Switch ComparisonNested Switch StatementsRecap - Advanced Decisions5Exception Handling
Try-Catch BasicsException TypesMultiple Catch BlocksWorking with FilesFinally BlockUsing vs. Try-FinallyCustom ExceptionsRecap - Error Handling3Loop Enhancements
Loop PerformanceIterating ComplexEach Loop TypeRefactoring LoopsRecap - Optimized Loops6Null Handling
Null Reference BasicsNullable Value TypesNull Checking PatternsDefensive ProgrammingRecap - Null Safety