5

FCLコードで珍しいサンプルを見つけました。

これは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'は実行ロジックにどのような影響を与えますか?

4

1 に答える 1

9

これStream.Close()は、例外がスローされた場合でもm_streamがnullに設定されるようにするためです。

コメントに応えて

Stream.Close()で発生する可能性のある例外の種類

ストリームを閉じると、バッファリングされた出力がフラッシュされ、ネットワーク障害などが原因で例外がスローされる可能性があります。

これが論理的根拠かどうかはわかりません。通常、ブロックを使用してDisposeを呼び出します。これは、変数がとにかく使用されないことを意味します。

In the above, if Stream.Close() throws, then m_stream will already be null. With the following alternative, m_stream won't be set to null if Stream.Close() throws:

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

But in this case if we're talking about exception-safety, someone can retry call to Dispose method and will face NullReferenceException

It won't throw a NullReferenceException because it tests for null:

if (copyOfStream != null && !m_leaveOpen)
        copyOfStream.Close();
于 2012-11-29T21:10:07.553 に答える