Будут ли окончательные блоки выполняться, если они возвращаются из блоков try или catch в С#? Если это так, перед возвращением или после?

Нет доступных материалов!

Ответы

Ответ 1

Да, блок finally выполняется, однако поток выходит из блока try - путем достижения цели, возврата или исключения исключения.

Из спецификации С# 4, раздел 8.10:

Операторы блока finally всегда выполняются, когда управление оставляет попытку выражение. Это верно, происходит ли передача контроля в результате нормального выполнение, в результате выполнения разрыва, продолжения, goto или возврата, или как результат распространения исключения из инструкции try.

(раздел 8.10 содержит намного больше подробностей об этом, конечно.)

Обратите внимание, что возвращаемое значение определяется до того, как выполняется блок finally, поэтому, если вы это сделали:

int Test()
{
    int result = 4;
    try
    {
        return result;
    }
    finally
    {
        // Attempt to subvert the result
        result = 1;
    }
}

... значение 4 все равно будет возвращено, а не 1 - назначение в блоке finally не будет иметь эффекта.

Ответ 2

Блок finally всегда будет выполнен, и это произойдет до возвращения из метода, поэтому вы можете безопасно писать код следующим образом:

try {
    return "foo";
} finally {
    // This will always be invoked
}

или если вы работаете с одноразовыми ресурсами:

using (var foo = GetFoo())
{
    // foo is guaranteed to be disposed even if an exception is thrown
    return foo.Bar();
}

Ответ 3

С обработкой исключений с двумя проходами, которую .NET наследует из окон, вы не можете точно сказать, что блок finally выполняется до того, как управление переходит обратно к вызывающему.

Блок finally будет выполнен после окончательных блоков в более вложенных кадрах вызовов, а до окончательных блоков и блока catch в менее вложенных кадрах вызовов, что согласуется с окончательным блоком, запущенным перед возвратом. Но все фильтры исключений между точкой бросания и точкой catch будут выполняться перед любыми окончательными блоками, а это означает, что при наличии исключения некоторый код вызывающего абонента может выполняться до окончательного блока.

Когда элемент управления обычно покидает блок (исключение не генерируется), он, наконец, запускается до того, как управление вернется к вызывающему.

Ответ 4

Будут ли окончательно блокироваться, если они возвращаются из блоков try или catch в C-Sharp?

ДА

Если это произойдет, перед возвратом или после?

перед