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 bei der Verwaltung von Ressourcen, die ordnungsgemäß freigegeben werden müssen. Die using-Anweisung bietet eine sauberere und prägnantere Möglichkeit, um sicherzustellen, dass IDisposable-Objekte ordnungsgemäß bereinigt werden.
Hinweis: using ersetzt das try-finally-Muster für die Freigabe von Ressourcen — es ersetzt nicht try-catch. Sie können weiterhin einen using-Block in einen try-catch-Block einschließen, um Ausnahmen zu behandeln.
Schauen wir uns zuerst einen try-finally-Ansatz an:
StreamReader reader = null;
try
{
reader = new StreamReader("file.txt");
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
finally
{
if (reader != null)
{
reader.Dispose();
}
}
Die using-Anweisung vereinfacht diesen Code:
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
Die using-Anweisung ruft automatisch Dispose() auf, wenn der Block verlassen wird, selbst wenn eine Exception auftritt.
Was ist StreamReader?StreamReader ist eine Klasse, die zum Lesen von Text aus Dateien verwendet wird. Sie erstellen eine Instanz, indem Sie einen Dateinamen übergeben, und sie öffnet die Datei zum Lesen. Sie implementiert IDisposable, daher muss sie nach der Verwendung ordnungsgemäß geschlossen werden – genau das übernimmt using für Sie.
Gängige StreamReader-Methoden:
ReadToEnd()— liest die gesamte Datei als eine einzelne ZeichenfolgeReadLine()— liest jeweils eine Zeile und gibtnullzurück, wenn das Ende der Datei erreicht ist
Um die Zeilen in einer Datei zu zählen, können Sie eine ReadLine()-Schleife verwenden:
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
Sie können auch using mit try-catch kombinieren, um Ausnahmen wie eine fehlende Datei zu behandeln:
try
{
using (StreamReader reader = new StreamReader("file.txt"))
{
int lineCount = 0;
while (reader.ReadLine() != null)
{
lineCount++;
}
Console.WriteLine(lineCount);
}
}
catch (FileNotFoundException)
{
Console.WriteLine("File not found");
}
Aufgabe
EinfachErstellen Sie eine Methode namens processFile, die:
- Einen Dateinamen als String-Parameter entgegennimmt
- Die
using-Anweisung mit einemStreamReaderverwendet, um alle Zeilen aus der Datei zu lesen - Die Anzahl der Zeilen in der Datei zurückgibt
- Falls eine
FileNotFoundExceptionauftritt, "File not found" ausgibt und -1 zurückgibt
Probier es selbst
using System;
using System.IO;
class ProcessFile
{
public static int processFile(string filename)
{
// Schreibe hier deinen Code
}
}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