Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Erstellen Sie eine Methode namens processFile, die:

  1. Nimmt einen Dateinamen als String-Parameter
  2. Verwendet die using-Anweisung mit einem StreamReader, um alle Zeilen aus der Datei zu lesen
  3. Gibt die Anzahl der Zeilen in der Datei zurück
  4. Falls eine FileNotFoundException auftritt, 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
    }
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Ablauf