Объявление using var
Конструкция using var res = ...;
не требует отдельных фигурных скобок:
Dispose вызовут в конце метода или
блока, где объявлена переменная. В отличие
от using (...) { }
граница ресурса - вся оставшаяся область,
а не только внутренний блок.
Синтаксис
using var res = new Door();
// Dispose в конце метода
Пример
Давайте объявим using var и дойдём
до конца Main:
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 -
здесь Dispose раньше конца метода
не вызывается:
using System;
class Door : IDisposable
{
public void Dispose()
{
Console.WriteLine("closed");
}
}
class Program
{
static void Main()
{
using var res = new Door();
Console.WriteLine("mid");
Console.WriteLine("end");
}
}
Результат выполнения кода:
"mid"
"end"
"closed"
Пример
Давайте ограничим область вложенным блоком:
using System;
class Door : IDisposable
{
public void Dispose()
{
Console.WriteLine("closed");
}
}
class Program
{
static void Main()
{
Console.WriteLine("start");
{
using var res = new Door();
Console.WriteLine("inner");
}
Console.WriteLine("after");
}
}
Результат выполнения кода:
"start"
"inner"
"closed"
"after"
Смотрите также
-
конструкция
using (...),
которая освобождает по концу блока -
await using,
асинхронный аналог освобождения -
блок
finally,
который тоже гарантирует завершение -
блок
try,
рядом с которым часто объявляют ресурс