Закрытие потоков, всегда необходимо?.сеть
Всегда нужно закрывать потоки или, поскольку управляемый код .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 именно по этой причине.