Поделиться через


оператор 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 удаления" статьи "Реализация метода 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# и примечании к предложению об использовании шаблонов и использовании объявлений.

См. также