Язык программирования C#9 и платформа .NET5. Страница 191
Повторное использование ключевого слова using в C#
Имея дело с управляемым объектом, который реализует интерфейс
IDisposableDispose()Console.WriteLine("***** Fun with Dispose *****\n");MyResourceWrapper rw = new MyResourceWrapper ();try{ // Использовать члены rw.}finally{ // Всегда вызывать Dispose(), возникла ошибка или нет. rw.Dispose();}Хотя это является хорошим примером защитного программирования, в действительности лишь немногих разработчиков привлекает перспектива помещения каждого освобождаемого типа внутрь блока
try/finallyDispose()Console.WriteLine("***** Fun with Dispose *****\n");// Метод Dispose() вызывается автоматически// при выходе за пределы области действия using.using(MyResourceWrapper rw = new MyResourceWrapper()){ // Использовать объект rw.}Если вы просмотрите код CIL операторов верхнего уровня посредством
ildasm.exeusingtry/finallyDispose().method private hidebysig static void '<Main>$'(string[] args) cil managed{ ... .try { } // end .try finally { IL_0019: callvirt instance void [System.Runtime]System.IDisposable::Dispose() } // end handler} // end of method '<Program>$'::'<Main>$'На заметку! Попытка применения
usingIDisposableНесмотря на то что такой синтаксис устраняет необходимость вручную помещать освобождаемые объекты внутрь блоков
try/finallyusingDispose()IDisposableDispose()usingКроме того, имейте в виду, что внутри
usingDispose()// Использовать список с разделителями-запятыми для объявления// нескольких объектов, подлежащих освобождению.using(MyResourceWrapper rw = new MyResourceWrapper(), rw2 = new MyResourceWrapper()){ // Работать с объектами rw и rw2.}Объявления using (нововведение в версии 8.0)
В версии C# 8.0 были добавлены объявления
usingusingusingusing{}Добавьте к своему классу следующий метод:
private static void UsingDeclaration(){ // Эта переменная будет находиться в области видимости // вплоть до конца метода. using var rw = new MyResourceWrapper(); // Сделать что-нибудь. Console.WriteLine("About to dispose."); // В этой точке переменная освобождается.}Далее добавьте к своим операторам верхнего уровня показанный ниже вызов:
Console.WriteLine("***** Fun with Dispose *****\n");...Console.WriteLine("Demonstrate using declarations");UsingDeclaration();Console.ReadLine();Если вы изучите новый метод с помощью
ildasm.exe.method private hidebysig static void UsingDeclaration() cil managed