Закрытие потоков, всегда необходимо?.сеть

Всегда нужно закрывать потоки или, поскольку управляемый код .net будет закрыт автоматически, как только он выпадет из области видимости (при условии, что исключений не было).

Illustrated:

static string SerialiseObjectToBase64(object obj)
{
    var mstream = new MemoryStream();
    ...
    return Convert.ToBase64String(mstream.ToArray());        
}

Является ли приведенный выше код приемлемым?

Ответы

Ответ 1

С MemoryStream это немного спорный вопрос - так как вы в конечном итоге разговариваете с управляемым byte[] (так что он все равно ждет обычной сборки мусора). Но в общем, да: вы должны закрыть (лучше: Dispose() через using, поэтому он отключается при исключении) поток, когда это делается, в противном случае вы можете не очистить некоторые данные до основного (неуправляемого) адресата. И есть некоторые потоки, которые на самом деле не полностью "смываются" на Flush() - им требуется, чтобы быть Close() d (в частности, потоки сжатия).

Ответ 2

Хорошая практика - закрыть ваши потоки. Используйте оператор using, и Dispose() будет вызываться, когда он выпадет из области видимости (или если выбрано исключение), что, в свою очередь, закроет ваш поток.

static string SerialiseObjectToBase64(object obj)
{
    using (var mstream = new MemoryStream())
    {
        ...
        return Convert.ToBase64String(mstream.ToArray());
    } 
}

Ответ 3

Закрытие потоков и удаление объектов - это две разные вещи. Закрывающие потоки стирают буфер записи и записывают в поток любые неписанные данные. Утилизация потока просто освободит память, используемую переменной потока.

Ответ 4

.Net GC очень... ленив. Просто потому, что ссылка была утеряна, это не означает, что она сразу же подметена, раздавлена ​​и отправлена ​​на полигон. Всегда полезно закрыть открытые ресурсы и избавиться от объектов, которые реализуют IDisposable именно по этой причине.