2016-02-02 9 views
5

私はこれを頭に入れようとしています。 this pageUsing上の声明によると:どのようにC#を使用してTry-Finallyに翻訳する

usingステートメントは、廃棄は、あなたがオブジェクトのメソッドを呼び出している間に例外が発生した場合でも呼ばれていることを保証します。 tryブロックの中にオブジェクトを置き、finallyブロックでDisposeを呼び出すことで同じ結果を得ることができます。これは、usingステートメントがコンパイラによってどのように変換されるかです。

しかし、それは述べてthis pageについてTry-Finallyブロックに:取り扱い例外以内

、関連するfinallyブロックが実行されることが保証されます。ただし、例外が未処理の場合、finallyブロックの実行は、例外の巻き戻し操作がどのようにトリガーされるかに依存します。

それでは、どのようUsing文は、それが最終的に文を呼び出すことが保証されていないTry-Finallyに変換した場合、例外が発生した場合にDisposeメソッドを呼び出すことを保証することができますか?

+0

私は正しいとは知らないので、答えはありませんが、catchステートメント内に未処理の例外があると、最終的に呼び出されないということがあります。しかし、使用して自動作成されたcatchステートメントでは、dispose()の呼び出しだけがあります。 – GendoIkari

+0

@GendoIkari:いいえ、それは例外がどこからスローされているのかとは関係ありませんが、最終的に捕まえられるかどうかは関係ありません。最終的にキャッチ(処理)される例外はfinallyブロックを常に呼び出します(キャッチから別の例外がスローされた場合でも)。少し驚くべきことに、未処理の例外は、最終的に呼び出しを行うかどうかはしません。 – Cameron

+0

@Cameron:ありがとう。私はあなたが最終的にそれを持っていれば例外を処理していると私は推測していたと思います。しかし、特定の例外のみを処理するキャッチを持つことは可能です。またはtry/finallyをキャッチせずに実行します。 – GendoIkari

答えて

10

実際にはtry/finallyのように振る舞います。アプリケーションが終了すると、リソースは破棄されないかもしれません。通常は処分がプロセスによって保持されるリソースを解放するためですOSはプロセスの終了時にそれらを整理します。 (それはそれだけで通常のtry/finallyと同じだ... Dispose方法が呼び出されることはありませんと言うことはありません。)明らかに

あなたは、ファイルシステム上の「ロックファイル」を持っている場合何か問題がありますが、電源切断などでも同じ問題が発生します。

+1

私はOPの「未処理の」とは、「全体としてアプリケーションによって未処理」ではなく「直ちにtry/finallyブロックで捕らえられない」と考えたのかもしれません。 – adv12

+0

UsingステートメントはDisposeが呼び出されることを本当に保証できないと言っていますよね? – TrueEddie

+0

@TrueEddie:確かに、通常のtry/finallyと同じ程度にしか保証できません。 –

5

プログラムから回復できない例外があります。その場合はfinallyブロック実行しないでください。たとえば、スタックオーバーフロー例外またはメモリ不足例外。

0

プログラムがクラッシュする未処理例外が発生した場合は、実行を停止するとブロックが実行されません。

tl; dr 最後に、ブロックは成功した場合、または処理された例外でのみ実行されます。

関連する問題