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