При вызове Bar строки появятся в порядке Dispose!, Oh, no!, Finally. Освобождение ресурса через using происходит до внешнего catch.
Последовательность вывода при работе с исключениями
При вызове Bar строки появятся в порядке Dispose!, Oh, no!, Finally. Освобождение ресурса через using происходит до внешнего catch.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Какой будет порядок вывода в консоль при вызове метода E.Bar()?\ncsharp\nclass E : IDisposable\n{\n public void Dispose() => Console.WriteLine(\"Dispose!\");\n\n public void Foo() => throw new Exception(\"Oh, no!\");\n\n public static void Bar()\n {\n try\n {\n using (var e = new E())\n {\n e.Foo();\n }\n }\n catch (Exception ex)\n {\n Console.WriteLine(ex.Message);\n }\n finally\n {\n Console.WriteLine(\"Finally\");\n }\n }\n}\n
Ответ
При вызове Bar строки появятся в порядке Dispose!, Oh, no!, Finally. Освобождение ресурса через using происходит до внешнего catch.
После исключения в Foo управление покидает using. Его скрытый finally вызывает Dispose, затем внешний catch печатает сообщение исходного исключения. В конце исполняется внешний finally.
Dispose!
Oh, no!
Finally
Это предполагает, что Dispose сам не выбрасывает исключение, как и в условии. Иначе catch увидит исключение освобождения ресурса. Обратные слеши и символы \n в исходной записи следует понимать как повреждённое оформление многострочного C#-примера.