Во-первых, нет, нет способа определить переменную внутри блока и получить к ней доступ вне блока. Не имеет значения, является ли это блоком try, блоком catch или чем-то еще. Блоки определяют область действия переменной, а переменные, определенные внутри блока, ограничиваются этим уровнем. А когда что-то выходит из области видимости, оно становится пригодным для сбора мусора (при условии, что число ссылок равно 0 и т. Д. И т. Д.).
Если вам нужен доступ к переменной за пределами блока, то, что вы сделали в конце, абсолютно правильно. Если вы используете try / catch, у вас гораздо больше проблем, связанных с производительностью, чем с объявлением переменной, происходящим снаружи (так как перехват включает в себя обход кадров для поиска обработчика и т. Д., И т. Д.).
То, что вы / могли / сделаете, это сгенерировали свое собственное исключение с объектом в данных. Я бы не рекомендовал это делать, так как мне непонятно, что вы хотите сделать. Если вы просто хотите убрать это, просто объявите это снаружи. Или, если вы не собираетесь ничего делать с этим исключением, ради всего святого, используйте декларацию using
. Да, ваш объект должен реализовывать IDisposable
, но если у вас есть код для очистки, технически вы тоже можете это сделать.
И последнее. Вы сказали:
Я хочу использовать экземпляр obj в предложении catch {}, даже если его состояние скомпрометировано.
Обратите внимание, что есть случаи, когда состояние может быть скомпрометировано, и вы не можете с этим справиться. StackOverflow
, ExecutionEngineException
и OutOfMemoryException
все приходят на ум. Кроме того, когда вы используете многопоточный код, все ставки отключены, если вы не блокируете должным образом.
Для быстрого ознакомления с такими вещами, как управление памятью, обработка исключений и т. Д., Вы можете взглянуть на эту презентацию , которую я делал по отладке .NET с WinDBG и SOS.