Опасно ли вызывать MemoryStream.ToArray () после удаления? - PullRequest
19 голосов
/ 20 октября 2010

В приведенном ниже коде есть ли вероятность, что GC очистит MemoryStream, так что ToArray выйдет из строя, поскольку он находится вне оператора using?

private static byte[] getBytes()
{
    MemoryStream ms = null;

    using (ms = new MemoryStream())
    {
        // ...
    }

    return ms.ToArray();
}

1 Ответ

21 голосов
/ 20 октября 2010

Нет, шансов на это нет. Это безопасно - MemoryStream сохраняет сильную ссылку на байтовый массив.

Я посмотрю, смогу ли я найти документацию о гарантиях ...

РЕДАКТИРОВАТЬ: вроде ...

С MemoryStream.Close:

Буфер все еще доступен на MemoryStream после закрытия потока.

По общему признанию, это не гарантирует для Dispose, но это задокументировано для вызова Stream.Close.

MemoryStream.Dispose(bool) может быть затем может быть переопределено для освобождения массива, но, по моему опыту, этого не произойдет, и в этот момент это будет серьезное изменение.

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