2017-11-07 16 views
1

私は、このコンソールアプリケーション(.NET Frameworkの4.5.2)している:Dispose方法はusingステートメントでもDisposeが呼び出されないのはなぜですか?

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var result = new Result()) 
     { 
      result.Test(); 
     } 
    } 
} 

public class Result : IDisposable 
{ 
    public void Test() 
    { 
     int a = 1; 
     int b = 1/(a - 1); 
    } 

    public void Dispose() 
    { 
     Console.WriteLine("Dispose"); 
    } 
} 

と呼ばれていないのはなぜ? DivideByZero -exception後にブレークポイントがDisposeにヒットせず、コンソールに出力されません(アプリケーションが終了しているため)。 MSドキュメントあたりとして

+0

どういう意味ですか? Disposeメソッドを直接呼び出すことはありませんでした。代わりにTestメソッドを呼び出しました。 – jLaw

+0

@jLawしかし、彼は結果を 'using'でラップしました –

+1

@jLawオブジェクトが' using'節にあるので、オブジェクトは節の末尾に配置されると期待するかもしれません。 –

答えて

6

:扱う例外内try-finally (C# Reference)

、関連最後にブロックが実行される が保証されます。ただし、例外が処理されていない場合、 finallyブロックの実行は、例外の巻き戻し操作が がどのようにトリガーされるかに依存します。これは、コンピュータのセットアップ方法に依存します。

あなたはDivideByZero例外をキャッチし、あなたマシンとセットアップそれは、コードの他の行が実行される前にアプリケーションをダウンさせ、したがって、finallyブロックを実行していないしなければならない上、それは未処理のこと聞かせていないと。

@Evkは以下のコメントに指摘しているように、デバッガを付けずに実行すると、例外を正しく巻き戻してfinallyブロックを実行します。毎日何か新しいことを学ぶ。考えてみて

Eric Lippert's answer to Finally Block Not Running?

1として、その状況がどのようにひどい:予期しない何かが は、誰も処理するコードを書いていないことが起こりました。 の正しいことは、この状況を処理するために作られた ではないでしょうか?おそらくない。 への正しいことは、最終的にブロックを実行しようとしないことです。そのため、 は悪い状況をさらに悪化させるためです。あなたはすでにプロセスが になっていることを知っています。それをすぐにその惨めからはずしてください。

処理されない例外が プロセスを停止させるシナリオでは、何かが起こる可能性があります。この場合、 の何が起こるかはインプリメンテーションによって定義されます。エラーがWindowsエラー の報告、デバッガの起動の有無などに報告されます。 CLRは であり、最終的にブロックを実行しようとする権利を完全に持ちますが、 も完璧に機能しません。このシナリオでは、すべて の賭けはオフです。異なる実装では異なるものを選択することができます。

+0

必ずしもそうではありませんが、一部の例外によりアプリが完全にシャットダウンすることがあります(ハードウェア例外など)。最終的にブロックを実行することが期待されましたが、私は最終的にブロックに入ることはありませんマシンで確認することができます –

+1

あなたの言葉は誤解を招いています、これは最終的に_never_が実行され、見積もりは「それは依存する」と述べている)。 – Evk

+0

@Evk良い点、言い回し/注文を変更しました –

関連する問題