Задать вопрос
Illivion
@Illivion

BinaryReader.Dispose(bool disposing) создает локальную ссылку на поток. Зачем?

Вот сам метод:
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; 
        }



m_stream — базовый поток

m_leaveOpen — задается в конструкторе, если желаем не закрывать поток при Dispose ридера.


Какой смысл скрывается за созданием ссылки на поток (copyOfStream)? Почему нельзя было вызвать

m_stream.Close();

m_stream = null;


Связано ли это с особенностями сборки мусора?
  • Вопрос задан
  • 3164 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@AM5800
Предположу, что это сделано, чтобы избежать NPE при вызове stream.Close(), если данный код вызывается одновременно из нескольких потоков. Ведь если написать:
if (stream != null) stream.Close();
То сразу после успешной проверки stream теоретически может стать равным null. При предварительном копировании в локальную переменную это исключено.
Ответ написан
@mayorovp
Это сделано, чтобы избежать NullPointerException при одновременных вызовах Close из разных потоков.

При нормальном использовании такая ситуация невозможна, но смысл исключений как раз в отлове ненормального использования. Данный трюк с копированием, фактически, заменяет NullPointerException на более соответствующее причине ошибки ObjectDisposedException
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы