Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dispose(bool disposing)创建对流的本地引用。为什么?_C#_Reference_Stream_Garbage Collection - Fatal编程技术网

C# Dispose(bool disposing)创建对流的本地引用。为什么?

C# Dispose(bool disposing)创建对流的本地引用。为什么?,c#,reference,stream,garbage-collection,C#,Reference,Stream,Garbage Collection,我在FCL代码中发现了一个不寻常的示例 这是System.IO.BinaryReader中的方法: protected virtual void Dispose(bool disposing) { if (disposing) { Stream copyOfStream = m_stream; m_stream = null; if (copyOfStream != null &&

我在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”对执行逻辑有什么影响

这样,即使
stream.Close()
抛出异常,m_stream也将被设置为null

回应评论

在Stream.Close()上可以引发什么类型的异常

关闭流时,将刷新任何缓冲输出,这可能引发异常,例如由于网络故障


我不确定这是一个理由。通常我们在using block中调用Dispose,这意味着无论如何都不会使用该变量

在上面的例子中,如果Stream.Close()抛出,那么m_Stream将已经为null。使用以下替代方法,如果stream.Close()抛出,m_stream将不会设置为null:


谢谢我也假设了这个选项,但是在Stream.Close()上会引发什么样的异常呢?我什么也没发现。我不确定这是不是一个理由。通常我们在using block中调用Dispose,这意味着无论如何都不会使用该变量。但在这种情况下,如果我们谈论异常安全,有人可以重试调用Dispose方法,并将面临NullReferenceException。也许另一个线程可以通过某种方式将
m_stream
设置为
null
,介于空检查和调用实例方法
Close()
之间?
m_stream.Close(); // <== throws
m_stream = null;  // <== not executed if Close() throws
if (copyOfStream != null && !m_leaveOpen)
        copyOfStream.Close();