Конструкция using
Запись using (var res = ...) { }
создаёт объект, реализующий
IDisposable, и вызывает Dispose
при выходе из блока - и при нормальном
завершении, и при исключении. Краткая форма
без скобок - в
using var.
Асинхронное освобождение - в
await using.
Синтаксис
using (var res = new Door())
{
// работа с ресурсом
}
Пример
Давайте вызовем Dispose после блока
using:
using System;
class Door : IDisposable
{
public void Dispose()
{
Console.WriteLine("closed");
}
}
class Program
{
static void Main()
{
using (var res = new Door())
{
Console.WriteLine("open");
}
}
}
Результат выполнения кода:
"open"
"closed"
Пример
Давайте освободим ресурс даже при исключении в блоке:
using System;
class Door : IDisposable
{
public void Dispose()
{
Console.WriteLine("closed");
}
}
class Program
{
static void Main()
{
try
{
using (var res = new Door())
{
throw new InvalidOperationException("abcde");
}
}
catch (InvalidOperationException)
{
Console.WriteLine("caught");
}
}
}
Результат выполнения кода:
"closed"
"caught"
Пример
Давайте сохраним текст из Dispose
в поле и выведем после блока:
using System;
class Door : IDisposable
{
public string Last = "";
public void Dispose()
{
Last = "closed";
}
}
class Program
{
static void Main()
{
Door door;
using (door = new Door())
{
Console.WriteLine("open");
}
Console.WriteLine(door.Last);
}
}
Результат выполнения кода:
"open"
"closed"
Смотрите также
-
using var,
который освобождает в конце метода -
await using,
который вызываетDisposeAsync -
блок
finally,
который тоже выполняется при выходе -
блок
try,
внутри которого часто пишутusing