2012-11-29 1 views
5

FCLコードで珍しいサンプルが見つかりました。BinaryReader.Dispose(bool disposing)は、ストリームへのローカル参照を作成します。どうして?

これはSystem.IO.BinaryReader方法である:

protected virtual void Dispose(bool disposing) { 
     if (disposing) { 
      Stream copyOfStream = m_stream; 
      m_stream = null; 
      if (copyOfStream != null && !m_leaveOpen) 
       copyOfStream.Close(); 
     } 
     m_stream = null; 
     m_buffer = null; 
     m_decoder = null; 
     m_charBytes = null; 
     m_singleChar = null; 
     m_charBuffer = null; 
    } 

'copyOfStream' が実行ロジックにどのような影響?

答えて

9

Stream.Close()が例外をスローしたとしても、m_streamがnullに設定されるようになりました。投げることができるコメントあなたは、ストリームを閉じると

は、バッファされた出力がフラッシュされるStream.Close()に上昇させることができる例外の種類を

に対応して

、例外、例えばネットワークに障害が発生したためです。

これは理論的根拠ではありません。通常、私たちはブロックを使用して処分を呼んでいるが、これは変数がStream.Close()がスローした場合、その後、m_streamはすでにnullになります、とにかく上記で

を使用したことがないことを意味します。

m_stream.Close(); // <== throws 
m_stream = null; // <== not executed if Close() throws 

しかし、この場合では、我々は例外安全性の話をしている場合、誰かが処分するコールを再試行することができます。Stream.Close()がスローした場合、次の代替では、m_streamはnullに設定されることはありません方法と、それはnullをテストするためにそれはとNullReferenceExceptionをスローしないであろうとNullReferenceException

に直面するだろう:

if (copyOfStream != null && !m_leaveOpen) 
     copyOfStream.Close(); 
+0

感謝を!私もそのオプションを仮定しましたが、Stream.Close()ではどのような例外が発生する可能性がありますか?私は何も見つかりませんでした。 – Illivion

+0

これが根拠であるかどうかはわかりません。通常は、ブロックを使用してDisposeを呼び出します。これは、変数が使用されることは決してありません。しかし、この場合、例外安全性について話していると、誰かがDisposeメソッドの呼び出しを再試行でき、NullReferenceExceptionに直面します。 –

+0

私のヌルチェックとインスタンスメソッド 'Close()'の呼び出しの間に、別のスレッドが何らかの形で 'm_stream'を' null'に設定できたのでしょうか? –

関連する問題