using-Anweisung (C#-Referenz)using statement (C# Reference)

Bietet eine praktische Syntax, die den ordnungsgemäßen Einsatz von IDisposable-Objekten sicherstelltProvides a convenient syntax that ensures the correct use of IDisposable objects. Ab C# 8.0 stellt die using-Anweisung die korrekte Verwendung von IAsyncDisposable-Objekten sicher.Beginning in C# 8.0, the using statement ensures the correct use of IAsyncDisposable objects.

BeispielExample

Im folgenden Beispiel wird veranschaulicht, wie Sie die Anweisung using verwenden.The following example shows how to use the using statement.

string manyLines=@"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

using (var reader = new StringReader(manyLines))
{
    string? item;
    do {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while(item != null);
}

Ab C# 8,0 können Sie die folgende alternative Syntax für die using-Anweisung verwenden, die keine geschweiften Klammern erfordert:Beginning with C# 8.0, you can use the following alternative syntax for the using statement that doesn't require braces:

string manyLines=@"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

using var reader = new StringReader(manyLines);
string? item;
do {
    item = reader.ReadLine();
    Console.WriteLine(item);
} while(item != null);

HinweiseRemarks

File und Font sind Beispiele für verwaltete Typen, die auf nicht verwaltete Ressourcen zugreifen (in diesem Fall Dateihandles und Gerätekontexte).File and Font are examples of managed types that access unmanaged resources (in this case file handles and device contexts). Es gibt viele andere Arten von nicht verwalteten Ressourcen und Klassenbibliothekstypen, die sie einschließen.There are many other kinds of unmanaged resources and class library types that encapsulate them. Alle Typen dieser Art müssen die IDisposable-Schnittstelle oder die IAsyncDisposable-Schnittstelle implementieren.All such types must implement the IDisposable interface, or the IAsyncDisposable interface.

Wenn die Lebensdauer eines IDisposable-Objekts auf eine einzige Methode beschränkt ist, sollten Sie es in der using-Anweisung deklarieren und instanziieren.When the lifetime of an IDisposable object is limited to a single method, you should declare and instantiate it in the using statement. Die using-Anweisung ruft die Methode Dispose ordnungsgemäß für das Objekt auf. Wenn Sie sie, wie vorher gezeigt, verwenden, führt dies auch dazu, dass das Objekt den gültigen Bereich verlässt, sobald Dispose aufgerufen wird.The using statement calls the Dispose method on the object in the correct way, and (when you use it as shown earlier) it also causes the object itself to go out of scope as soon as Dispose is called. Innerhalb des using-Blocks ist das Objekt schreibgeschützt und kann nicht geändert oder neu zugewiesen werden.Within the using block, the object is read-only and can't be modified or reassigned. Wenn das Objekt IAsyncDisposable anstelle von IDisposable implementiert, ruft die using-Anweisung die DisposeAsync-Methode und den awaits-Operator für die zurückgegebene ValueTask-Klasse auf.If the object implements IAsyncDisposable instead of IDisposable, the using statement calls the DisposeAsync and awaits the returned ValueTask. Weitere Informationen zu IAsyncDisposable finden Sie unter Implementieren einer DisposeAsync-Methode.For more information on IAsyncDisposable, see Implement a DisposeAsync method.

Mit der Anweisung using wird sichergestellt, dass Dispose (oder DisposeAsync) aufgerufen wird, selbst wenn eine Ausnahme im using-Block auftritt.The using statement ensures that Dispose (or DisposeAsync) is called even if an exception occurs within the using block. Sie können das gleiche Ergebnis erzielen, indem Sie das Objekt in einen try-Block einfügen und dann Dispose (oder DisposeAsync) in einem finally-Block aufrufen. So übersetzt der Compiler die Anweisung using.You can achieve the same result by putting the object inside a try block and then calling Dispose (or DisposeAsync) in a finally block; in fact, this is how the using statement is translated by the compiler. Das vorherige Codebeispiel wird zur Kompilierzeit auf den folgenden Code erweitert (beachten Sie die zusätzlichen geschweiften Klammern zum Erstellen des eingeschränkten Gültigkeitsbereichs für das Objekt):The code example earlier expands to the following code at compile time (note the extra curly braces to create the limited scope for the object):

string manyLines=@"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

{
    var reader = new StringReader(manyLines);
    try {
        string? item;
        do {
            item = reader.ReadLine();
            Console.WriteLine(item);
        } while(item != null);
    } finally
    {
        reader?.Dispose();
    }
}

Die neuere Syntax der using-Anweisung wird in ähnlichen Code übersetzt.The newer using statement syntax translates to similar code. Der try-Block wird geöffnet, in dem die Variable deklariert wird.The try block opens where the variable is declared. Der finally-Block wird am Ende des einschließenden Blocks hinzugefügt, in der Regel am Ende einer Methode.The finally block is added at the close of the enclosing block, typically at the end of a method.

Weitere Informationen über die Anweisung try-finally finden Sie im Artikel zu try-finally.For more information about the try-finally statement, see the try-finally article.

Mehrere Instanzen eines Typs können wie im folgenden Beispiel gezeigt in einer einzelnen using-Anweisung deklariert werden.Multiple instances of a type can be declared in a single using statement, as shown in the following example. Beachten Sie, dass Sie Variablen mit impliziten Typen (var) nicht verwenden können, wenn Sie mehrere Variablen in einer einzelnen Anweisung deklarieren:Notice that you can't use implicitly typed variables (var) when you declare multiple variables in a single statement:

string numbers=@"One
Two
Three
Four.";
string letters=@"A
B
C
D.";

using (StringReader left = new StringReader(numbers),
    right = new StringReader(letters))
{
    string? item;
    do {
        item = left.ReadLine();
        Console.Write(item);
        Console.Write("    ");
        item = right.ReadLine();
        Console.WriteLine(item);
    } while(item != null);
}

Sie können wie im folgenden Beispiel gezeigt auch mehrere Deklarationen desselben Typs mithilfe der neuen Syntax kombinieren, die mit C# 8 eingeführt wurde:You can combine multiple declarations of the same type using the new syntax introduced with C# 8 as well, as shown in the following example:

string numbers=@"One
Two
Three
Four.";
string letters=@"A
B
C
D.";

using StringReader left = new StringReader(numbers),
    right = new StringReader(letters);
string? item;
do {
    item = left.ReadLine();
    Console.Write(item);
    Console.Write("    ");
    item = right.ReadLine();
    Console.WriteLine(item);
} while(item != null);

Sie können das Ressourcenobjekt instanziieren und die Variable an die using-Anweisung übergeben. Diese Vorgehensweise wird jedoch nicht empfohlen.You can instantiate the resource object and then pass the variable to the using statement, but this isn't a best practice. In diesem Fall verbleibt das Objekt im Gültigkeitsbereich, nachdem das Steuerelement den using-Block verlassen hat, obwohl es wahrscheinlich keinen Zugriff auf dessen nicht verwaltete Ressourcen hat.In this case, after control leaves the using block, the object remains in scope but probably has no access to its unmanaged resources. Das heißt, dass es nicht mehr vollständig initialisiert wird.In other words, it's not fully initialized anymore. Wenn Sie versuchen, das Objekt außerhalb des using-Blocks zu verwenden, riskieren Sie, dass eine Ausnahme ausgelöst wird.If you try to use the object outside the using block, you risk causing an exception to be thrown. Aus diesem Grund ist es besser, das Objekt in der using-Anweisung zu instanziieren und dessen Bereich auf den using-Block zu begrenzen.For this reason, it's better to instantiate the object in the using statement and limit its scope to the using block.

string manyLines=@"This is line one
This is line two
Here is line three
The penultimate line is line four
This is the final, fifth line.";

var reader = new StringReader(manyLines);
using (reader)
{
    string? item;
    do {
        item = reader.ReadLine();
        Console.WriteLine(item);
    } while(item != null);
}
// reader is in scope here, but has been disposed

Weitere Informationen zum Verwerfen von IDisposable-Objekten finden Sie unter Verwenden von Objekten, die IDisposable implementieren.For more information about disposing of IDisposable objects, see Using objects that implement IDisposable.

C#-SprachspezifikationC# language specification

Weitere Informationen finden Sie unter Die using-Anweisung in der C#-Sprachspezifikation.For more information, see The using statement in the C# Language Specification. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.The language specification is the definitive source for C# syntax and usage.

Siehe auchSee also