оператор using — убедитесь, что одноразовые объекты правильно используются.

Инструкция using обеспечивает правильное использование экземпляра IDisposable :

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

Когда элемент управления покидает блок инструкции using , полученный IDisposable экземпляр удаляется. В частности, using инструкция гарантирует, что одноразовый экземпляр удаляется, даже если в блоке using инструкции возникает исключение. В предыдущем примере открытый файл закрывается после обработки всех строк.

Используйте инструкцию await using для правильного использования экземпляра IAsyncDisposable :

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

Дополнительные сведения об использовании экземпляров IAsyncDisposable см. в разделе Using async disposable статьи Реализация метода DisposeAsync .

Вы также можете использовать usingобъявление , которое не требует фигурных скобок:

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

При объявлении using в объявлении локальная переменная удаляется в конце область, в котором она объявлена. В предыдущем примере удаление происходит в конце метода .

Переменная, объявленная оператором или объявлением using , доступна только для чтения. Его нельзя переназначить или передать в качестве ref параметра или out .

В одной using инструкции можно объявить несколько экземпляров одного типа, как показано в следующем примере:

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

При объявлении нескольких экземпляров в одном using операторе они удаляются в обратном порядке объявления.

Вы также можете использовать using оператор и объявление с экземпляром структуры ссылки , которая соответствует шаблону одноразовых значений. То есть он имеет метод экземпляра Dispose , который является доступным, без параметров и имеет тип возвращаемого void значения.

Оператор using также может иметь следующий вид:

using (expression)
{
    // ...
}

где expression создает одноразовый экземпляр. Это показано в следующем примере:

StreamReader reader = File.OpenText(filePath);

using (reader)
{
    // Process file content
}

Предупреждение

В предыдущем примере после того, как элемент управления покидает инструкциюusing, одноразовый экземпляр остается в область пока он уже удален. При дальнейшем использовании этого экземпляра может возникнуть исключение, например ObjectDisposedException. Поэтому рекомендуется объявлять одноразовую переменную в операторе using или с using помощью объявления .

Спецификация языка C#

Дополнительные сведения см. в разделе Оператор usingспецификации языка C# и в примечании к предложению об использовании на основе шаблонов и использовании объявлений.

См. также раздел