Если мы на мгновение проигнорируем проблему с областью видимости, компилятору пришлось бы работать намного усерднее в ситуации, которая не была четко определена. Хотя это не является невозможным, ошибка определения объема также вынуждает вас, автора кода, понимать смысл написанного вами кода (что строка s может быть нулевой в блоке catch). Если ваш код был допустим, в случае исключения OutOfMemory, s даже не гарантируется выделение слота памяти:
// won't compile!
try
{
VeryLargeArray v = new VeryLargeArray(TOO_BIG_CONSTANT); // throws OutOfMemoryException
string s = "Help";
}
catch
{
Console.WriteLine(s); // whoops!
}
CLR (и, следовательно, компилятор) также заставляет вас инициализировать переменные перед их использованием. В представленном блоке вылова это не может быть гарантировано.
Таким образом, в конечном итоге компилятору приходится выполнять большую работу, что на практике не приносит большой пользы и, вероятно, может сбить людей с толку и заставить их спросить, почему try / catch работает по-другому.
В дополнение к непротиворечивости, не допуская ничего сложного и придерживаясь уже установленной семантики определения объема, используемой во всем языке, компилятор и CLR способны обеспечить большую гарантию состояния переменной внутри блока catch. Что он существует и был инициализирован.
Обратите внимание, что разработчики языка проделали хорошую работу с другими конструкциями, такими как , используя и lock , где проблема и область действия четко определены, что позволяет писать более понятный код.
например. с использованием ключевого слова с IDisposable объектов в:
using(Writer writer = new Writer())
{
writer.Write("Hello");
}
эквивалентно:
Writer writer = new Writer();
try
{
writer.Write("Hello");
}
finally
{
if( writer != null)
{
((IDisposable)writer).Dispose();
}
}
Если ваш try / catch / finally труден для понимания, попробуйте рефакторинг или введение другого уровня косвенного обращения с промежуточным классом, который инкапсулирует семантику того, что вы пытаетесь выполнить. Не видя реального кода, трудно быть более конкретным.