Блок finally находится в той же области действия, что и try / catch, поэтому у вас будет доступ ко всем переменным, определенным внутри.
Представьте, что у вас есть обработчик файлов, в этом разница в том, как он будет написан.
try
{
StreamReader stream = new StreamReader("foo.bar");
stream.write("foo");
}
catch(Exception e) { } // ignore for now
finally
{
stream.close();
}
по сравнению с
StreamReader stream = null;
try
{
stream = new StreamReader("foo.bar");
stream.write("foo");
} catch(Exception e) {} // ignore
if (stream != null)
stream.close();
Помните, что что-то внутри, в конце концов, не может работать. Представьте, что вы получаете сигнал об отмене, сбой Windows или отключение питания. Наконец, полагаться на критически важный для бизнеса код - это плохо.