MemoryStream должен быть явно уничтожен? - PullRequest
6 голосов
/ 16 ноября 2010

Поскольку MemoryStream является неуправляемым ресурсом, его всегда нужно утилизировать?

Дано:

1) A method is invoked.
2) A MemoryStream object is created (MemoryStream ms = new MemoryStream();).
3) An exception occurs and is caught from the invoking classes.

Поэтому ссылка на объект MemoryStream теряется. Нужен ли в этом сценарии блок try / finally (или оператор using)?

Ответы [ 4 ]

16 голосов
/ 16 ноября 2010

Как правило, все одноразовые объекты должны быть всегда утилизированы.

Однако, на самом деле MemoryStream не нужно утилизировать, поскольку у него нет неуправляемых ресурсов.(Это просто byte[] и int)
Единственная причина, по которой он одноразовый в первую очередь, заключается в том, что он наследует абстрактный класс Stream, который реализует IDisposable.

Обратите внимание, что каждый другой поток должен быть удален.

3 голосов
/ 16 ноября 2010

Любой тип, который реализует IDisposable, должен иметь Dispose, вызываемый для него либо явно через блок try / catch / finally или через оператор using.

В таких случаях, как этот, технически MemoryStream не нужно утилизировать, однако, чтобы соблюдать интерфейс и защитить себя от изменений в нисходящем направлении, Dispose все равно следует вызывать.

1 голос
/ 16 ноября 2010

MemoryStream реализует IDisposable, поэтому, когда это возможно, используйте оператор using.

Если это невозможно, включите блок try / catch / finally.

В случаях, когда вам нужно позволить объекту выйти за рамки вашего кода (когда использование или try / catch / finally не работает), вызывающая сторона несет ответственность за реализацию явного удаления.

0 голосов
/ 16 ноября 2010

См. Здесь Как избежать проблем с оператором использования

Посмотрел на IL и using делает это:

try
{
}finally
{
((System.IDisposable)obj).Dispose();
}

Что означает, что ваш поток будет удален независимо от того, что, кроме исключения (если это происходит в блок try) останется в стеке, поэтому может привести к сбою приложения, если вы не позаботитесь о нем.

Итак: «Ссылка на объект MemoryStream, следовательно, теряется. Нужен ли в этом сценарии блок try / finally (или оператор using)?» - Это то же самое

Теперь действительно интересно, что произойдет, если метод Dispose по какой-то причине завершится неудачно. у вас дыра в безопасности IE :) Шучу:)

...