Да, блок finally
выполняется, однако поток покидает блок try
- достигая конца, возвращая или выбрасывая исключение.
Из спецификации C # 4, раздел 8.10:
Операторы блока finally всегда выполняются, когда управление оставляет попытку
заявление. Это верно, если передача управления происходит в результате нормального
выполнение в результате выполнения оператора break, continue, goto или return или как
результат распространения исключения из оператора try.
(Разумеется, в разделе 8.10 гораздо больше подробностей).
Обратите внимание, что возвращаемое значение определяется за до , хотя выполняется блок finally, поэтому, если вы сделали это:
int Test()
{
int result = 4;
try
{
return result;
}
finally
{
// Attempt to subvert the result
result = 1;
}
}
... все равно будет возвращено значение 4, а не 1 - назначение в блоке finally
не окажет никакого влияния.