1

次のコードがあります。

        public void Dispose()
        {
            bool append = true;
            using(var log = new System.IO.StreamWriter("log.txt", append))
            {
                log.WriteLine("Disposing");
                log.Flush();
            }
        }

したがって、StreamWriter が例外をスローするリスクがあります。それは、私のオブジェクトが破棄されないことを意味しますか? これを Try/Catch でラップするだけで問題は解決しますか?

ありがとう。

4

2 に答える 2

3

これが何を意味するかによって異なります。

それは私のオブジェクトが破棄されないことを意味しますか?

あなたのオブジェクトはDisposeそれを呼び出しました。そうでなければ、StreamWriterコードに到達しませんでした。そのDispose呼び出しは完了していない可能性がありますが、オブジェクトに「処理済みまたは未処理」という魔法のフラグがあるわけではありません。

破棄は、ガベージ コレクションおよびファイナライズとは論理的に分離されていることに注意してください。オブジェクト、通常と同じ方法でガベージ コレクションの対象となります (ライブ参照がない場合)。抑制していない場合でも呼び出されます。

IDisposableC# は言語レベルで をサポートしていますが、CLRは実際には気にしないことを理解することが重要です。これは単なる別のインターフェースであり、Dispose別の方法です。

一般にDispose、例外をスローすることはお勧めできません (既存の失敗した操作のクリーンアップの一環としてオブジェクトが破棄された場合、元の例外が失われてしまうため) が、何らかの方法で CLR を根本的に損傷することはありません。

于 2012-06-28T16:32:26.010 に答える
0

したがって、StreamWriter が例外をスローするリスクがあります。それは、私のオブジェクトが破棄されないことを意味しますか? これを Try/Catch でラップするだけで問題は解決しますか?

StreamWriter が例外をスローした場合、副作用は次のものが実行されないことだけです。

 log.WriteLine("Disposing");
 log.Flush();

残りはすべて期待どおりになります。StreamWriter も適切に破棄されます。using(それがキーワードの目的です)

于 2012-06-28T16:33:26.277 に答える