using-Anweisung: Sicherstellen der ordnungsgemäßen Verwendung verwerfbarer Objekte

Die using-Anweisung stellt die ordnungsgemäße Verwendung einer IDisposable-Instanz sicher:

var numbers = new List<int>();
using (StreamReader reader = File.OpenText("numbers.txt"))
{
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
}

Wenn das Steuerelement den Block der using-Anweisung verlässt, wird eine abgerufene IDisposable-Instanz verworfen. Insbesondere stellt die using-Anweisung sicher, dass eine verwerfbare Instanz gelöscht wird, auch wenn eine Ausnahme innerhalb des Blocks der using-Anweisung auftritt. Im vorherigen Beispiel wird eine geöffnete Datei geschlossen, nachdem alle Zeilen verarbeitet wurden.

Verwenden Sie die await using-Anweisung, um eine IAsyncDisposable-Instanz ordnungsgemäß zu verwenden:

await using (var resource = new AsyncDisposableExample())
{
    // Use the resource
}

Weitere Informationen zur Verwendung von IAsyncDisposable-Instanzen finden Sie im Abschnitt Verwenden von asynchron verwerfbar des Artikels Implementieren einer DisposeAsync-Methode.

Sie können auch eine using-Deklaration verwenden, die keine geschweiften Klammern erfordert:

static IEnumerable<int> LoadNumbers(string filePath)
{
    using StreamReader reader = File.OpenText(filePath);
    
    var numbers = new List<int>();
    string line;
    while ((line = reader.ReadLine()) is not null)
    {
        if (int.TryParse(line, out int number))
        {
            numbers.Add(number);
        }
    }
    return numbers;
}

Bei der Deklaration in einer using-Deklaration wird eine lokale Variable am Ende des Bereichs verworfen, in dem sie deklariert wurde. Im vorherigen Beispiel erfolgt das Verwerfen am Ende einer Methode.

Eine Variable, die von der using-Anweisung oder -Deklaration deklariert wird, ist schreibgeschützt. Sie können sie nicht neu zuweisen oder als ref- oder out-Parameter übergeben.

Sie können mehrere Instanzen desselben Typs in einer using-Anweisung deklarieren, wie das folgende Beispiel zeigt:

using (StreamReader numbersFile = File.OpenText("numbers.txt"), wordsFile = File.OpenText("words.txt"))
{
    // Process both files
}

Wenn Sie mehrere Instanzen in einer using-Anweisung deklarieren, werden sie in umgekehrter Reihenfolge der Deklaration verworfen.

Sie können auch die using-Anweisung und -Deklaration mit einer ref struct-Instanz (Verweisstruktur) verwenden, die dem verwerfbaren Muster entspricht. Das heißt, sie umfasst eine Instanzmethode Dispose, auf die zugegriffen werden kann, die parameterlos ist und einen Rückgabetyp void aufweist.

Die using-Anweisung kann auch folgende Form aufweisen:

using (expression)
{
    // ...
}

Dabei erzeugt expression eine verwerfbare Instanz. Dies wird im folgenden Beispiel veranschaulicht:

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Warnung

Nachdem das Steuerelement im vorherigen Beispiel die using-Anweisung verlassen hat, verbleibt eine verwerfbare Instanz im Bereich, während sie bereits verworfen ist. Wenn Sie diese Instanz weiter verwenden, tritt möglicherweise eine Ausnahme auf, z. B. ObjectDisposedException. Aus diesem Grund empfehlen wir, eine verwerfbare Variable innerhalb der using-Anweisung oder mit der using-Deklaration zu deklarieren.

C#-Sprachspezifikation

Weitere Informationen finden Sie unter dem Abschnitt Die using-Anweisung der C#-Sprachspezifikation und unter dem Vorschlagshinweis zu Musterbasierte Verwendung und using-Deklarationen.

Weitere Informationen