Возвращение объекта с неразмещенным потоком памяти вызывает утечки памяти? - PullRequest
3 голосов
/ 05 января 2011

Я сталкивался с рутиной, которая делает что-то вроде этого:

static public Bitmap byte2bmp(byte[] BitmapData)
{
    MemoryStream ms = new MemoryStream(BitmapData);
    return (new Bitmap(ms));
}

Я боюсь, что это не лучший рекомендуемый подход.Правильно ли настроена мс в этом сценарии?

Или было бы лучше присвоить результат временному растровому изображению, избавиться от потока, а затем вернуть временный объект?

static public Bitmap byte2bmp(byte[] BitmapData)
{
    MemoryStream ms = new MemoryStream(BitmapData);
    Bitmap temp=new Bitmap(ms);
    ms.Dispose();
    return (temp);
}

Я надеялся, что «использование» может быть использовано в этом сценарии, но я не уверен, что оно будет вести себя правильно или нет:

static public Bitmap byte2bmp(byte[] BitmapData)
{
    using(MemoryStream ms = new MemoryStream(BitmapData))
    {
    return (new Bitmap(ms));
    }
}

Какое наиболее эффективное / правильное решение?Спасибо!

1 Ответ

2 голосов
/ 05 января 2011

Вы правы, опасаясь, что первый подход не даст дозу ms. В качестве хорошей практики вы всегда должны вызывать метод Dispose для объектов, которые реализуют IDisposable.

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

Вот как код сломался бы во время выполнения: сначала будет вычислено возвращаемое выражение, затем блок try-finally (для которого оператор using является просто синтаксическим сахаром) выполняется, и, наконец, метод вернется.

Единственный случай, когда у вас могут возникнуть проблемы с возвратом в середине оператора using, это , если вы возвращаете переменную из самого оператора using . Конечно, это в любом случае может вызвать проблемы, если вы сохраните какую-либо ссылку на переменную вне области действия using блока.

Также см .: Рекомендации по возврату из блоков

...