Закрытие потоков всегда необходимо? .сеть - PullRequest
16 голосов
/ 02 марта 2010

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

Иллюстрированный:

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

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

Ответы [ 4 ]

12 голосов
/ 02 марта 2010

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

9 голосов
/ 02 марта 2010

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

static string SerialiseObjectToBase64(object obj)
{
    using (var mstream = new MemoryStream())
    {
        ...
        return Convert.ToBase64String(mstream.ToArray());
    } 
}
4 голосов
/ 02 марта 2010

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

3 голосов
/ 02 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...