using instrukcja — zapewnienie prawidłowego użycia obiektów jednorazowych

Instrukcja using zapewnia prawidłowe użycie IDisposable wystąpienia:

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);
        }
    }
}

Gdy kontrolka opuszcza blok instrukcji using , pozyskane IDisposable wystąpienie zostanie usunięte. W szczególności instrukcja gwarantuje, using że wystąpienie jednorazowe zostanie usunięte, nawet jeśli wystąpi wyjątek w bloku instrukcji using . W poprzednim przykładzie otwarty plik jest zamykany po przetworzeniu wszystkich wierszy.

Użyj instrukcji , await using aby poprawnie użyć IAsyncDisposable wystąpienia:

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

Aby uzyskać więcej informacji na temat korzystania z IAsyncDisposable wystąpień, zobacz sekcję Using async unieszkodliwiania artykułu Implement a DisposeAsync method (Implementowanie metody DisposeAsync).

Można również użyć usingdeklaracji , która nie wymaga nawiasów klamrowych:

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;
}

Po zadeklarowaniu using w deklaracji zmienna lokalna jest usuwana na końcu zakresu, w którym jest zadeklarowana. W poprzednim przykładzie usuwanie odbywa się na końcu metody.

Zmienna zadeklarowana przez instrukcję lub deklarację using jest tylko do odczytu. Nie można ponownie przypisać go ani przekazać go jako parametru ref lub out .

Można zadeklarować kilka wystąpień tego samego typu w jednej using instrukcji, jak pokazano w poniższym przykładzie:

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

Po zadeklarowaniu kilku wystąpień w jednej using instrukcji są one usuwane w odwrotnej kolejności deklaracji.

Można również użyć instrukcji using i deklaracji z wystąpieniem struktury ref, która pasuje do wzorca jednorazowego. Oznacza to, że ma metodę wystąpienia Dispose , która jest dostępna, bez parametrów i ma typ zwracany void .

Instrukcja using może być również następująca:

using (expression)
{
    // ...
}

w przypadku wystąpienia expression jednorazowego. W poniższym przykładzie pokazano, że:

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Ostrzeżenie

W poprzednim przykładzie po opuszczeniu instrukcji kontrolka using wystąpienie jednorazowe pozostaje w zakresie, gdy jest już usuwane. Jeśli używasz tego wystąpienia dalej, może wystąpić wyjątek, na przykład ObjectDisposedException. Dlatego zalecamy zadeklarowanie zmiennej jednorazowej using w instrukcji lub deklaracji using .

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję using statement specyfikacji języka C# i propozycję dotyczącą "opartych na wzorcu using" i "using deklaracji".

Zobacz też