2

次のコードがあります。

class SampleClass : IDisposable
{

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

static void Main(string[] args)
{
    SampleClass sc = new SampleClass();

    try
    {
        throw new Exception();
    }
    finally
    {
        sc.Dispose();
    }
}

しかし、これを実行してもExecute Dispose!メッセージが出力されません。これはなぜですか?

アップデート:

コードを次のように変更した場合:

static void Main(string[] args)
{
    SampleClass sc = new SampleClass();

    try
    {
        try
        {
            throw new Exception();
        }
        finally
        {
            sc.Dispose();
        }
    }
    catch
    {
        throw;
    }
}

最初にメッセージを出力してからクラッシュします。

私が考えているのは、アプリが最初にクラッシュした場合、好きなように破棄できるかということです。

私はそれが簡単であることを知っています, しかし、私は本当に何をもっと学ぶべきか.

4

5 に答える 5

11

未処理の例外があります。未処理の例外がある場合、プログラムの動作は実装に依存します

あなたが発見したように、あなたの特定の実装では、未処理の例外は最初に未処理の例外をデバッグするか (またはコンソールに例外を出力するか) を尋ねてから、finally ブロックを実行します。

未処理の例外がある場合、finally ブロックが実行される保証はないことに注意してください。実装は、処理されない例外が発生した場合、適切であると判断した場合、すぐにプロセスを終了することができます。

その動作が気に入らない場合は、例外を防止または処理するか、より適切な機能を実行するランタイムの別の実装を取得するかを選択できます。

于 2011-07-09T14:57:07.520 に答える
10

ウィンドウに印刷Execute Dispose!します。もっとよく見るべきです。

于 2011-07-08T21:58:22.267 に答える
5

私のテスト(LinqPad)で実行されます。

通常のコンソール アプリとして、メッセージは例外メッセージの後に表示されます。

未処理の例外: System.Exception: タイプ 'System.Exception' の例外がスローされました。
D:...\Program .cs:line 27 の OutputTest.Program.Main(String[] args) で
Dispose を実行します。
何かキーを押すと続行します 。. .

ただし、「アプリが動作を停止しました」ウィンドウを閉じた場合にのみ表示されます

于 2011-07-08T21:59:01.250 に答える
2

それは印刷されます。「アプリケーションが動作を停止しました」という例外が表示されていない可能性があります。[キャンセル] をクリックして、印刷されたメッセージを確認します。

スクリーンショット:

ここに画像の説明を入力

于 2011-07-08T22:01:00.967 に答える
0

他の人が言ったように、コードは機能します。ただし、usingコンストラクターを使用することもできます (クラスが IDisposable を実装している場合は、コンストラクターを使用できます)。

class SampleClass : IDisposable {
    public void Dispose() {
        Console.WriteLine("Execute Dispose!");
    }
}

static void Main(string[] args) { 
    using (SampleClass sc = new SampleClass()) {
        throw new Exception();
    }
}
于 2011-07-09T16:07:02.473 に答える