4

CIL の静的解析ツールを作成しています。finally ブロックが try-catch ブロックとして解釈され、catch 内で再スローされると、制御フロー分析が簡素化されます。C# では、次の違いがわかりません。

try
{
    // ...
}
finally
{
    // finally code here
}

try
{
    // ...
}
catch
{
    // finally code here
    throw;
}

または間

try
{
    // ...
}
catch(Exception e)
{
    // catch code here
}
finally
{
    // finally code here
}

try
{
    try
    {
        // ...
    }
    catch (Exception e)
    {
        // catch code here
    }
}
catch
{
    // finally code here
    throw;
}

CIL には、finally ブロックと endfinally 命令さえあります。違いがあるはずですよね?

4

2 に答える 2

14

いいえ -finally例外がスローされなくても、別のブロックが例外をキャッチしたとしても、ブロックは実行さますcatch。(これは、catchブロック自体が例外をスローするかどうかに関係なく当てはまります。)

ああ、finallyブロックがメソッドから返された場合にブロックが実行されます。try

基本的に、実行がステートメントを離れたときにコードを常に実行したい場合は、それがfinally必要です。finallyC# では明示的なブロックを書くことはめったにありませんusingが、ほとんどの場合、ステートメントを使用するとコードが単純になります。

于 2013-05-11T10:25:18.387 に答える