2013-08-11 3 views
8

私はこのコードを持っていますが、私はそれが "安全ではない"と心配しています 私はDispose()をusingステートメントの終わりの前に使いましたが、私にとってはそれはやや理にかなっています。だから、それは安全ですか?ステートメント終了を使用する前にDispose()を呼び出すとどうなりますか?

using (FileStream stream = new FileStream(SfilePath, FileMode.Open)) 
{ 
    try 
    { 
     XmlSerializer deserializer = new XmlSerializer(typeof(HighscoresViewModel)); 
     HVM = deserializer.Deserialize(stream) as HighscoresViewModel; 
    } 
    catch (InvalidOperationException) 
    { 
     stream.Dispose(); 
     (new FileInfo(SfilePath)).Delete(); 
     HVM = new HighscoresViewModel(); 
    } 
} 
+0

オブジェクトを2回処分しようとします。 –

+0

@JeroenvanLangen:それは間違っています。 hwdの答えを参照してください。 – siride

+0

@siride - 'stream'は2回配置されます。 Jeroensのコメントの唯一の誤りは、単語 'try'です。 –

答えて

14

IDisposable.Dispose状態のドキュメント:

オブジェクトのDisposeメソッドが複数回呼び出された場合、オブジェクトは最初のものの後にすべての呼び出しを無視しなければなりません。オブジェクトは、そのDisposeメソッドが複数回呼び出された場合、例外をスローしてはなりません。 Dispose以外のインスタンスメソッドは、リソースがすでに破棄されているときにObjectDisposedExceptionをスローできます。

IDisposableが正しく実装されていると仮定すると、この使用は安全です。 Disposeは2回目に呼び出され、2回目は何も行いません。

1

この使用法は安全だとよく言われているように@hvd;あなたがそれが

メソッドの実装では、複数の原因となるコードパスが含まれていると言うFxCopの警告/エラーCA2202: Do not dispose objects multiple times

See here

をスローしますあなたのコードサンプルにMicrosoft Fxcopを実装する場合、原因お勧めしません 同じオブジェクトの一部の型では、Close()メソッドなど、IDisposable.DisposeまたはDispose相当の呼び出しを呼び出します。