Udostępnij przez


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 w artykule 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.

Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację funkcji w publicznej wersji zapoznawczej nadchodzącej wersji językowej.

Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.

Wskazówka

Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.

Zmienna zadeklarowana przez instrukcję lub deklarację using jest tylko do odczytu. Nie można go ponownie przypisać 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 .

using Wewnątrz return bloku nadal gwarantuje usunięcie. Kompilator ponownie zapisuje go w obiekcie try/finally, więc zasób jest zawsze wywoływany Dispose , zanim metoda rzeczywiście zwróci wartość .

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

using (expression)
{
    // ...
}

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

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 należy zadeklarować zmienną jednorazową w instrukcji using lub z deklaracją using .

specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz sekcję using statementspecyfikacji języka C#.

Zobacz też