При утилизации растровых изображений или нет в .NET? - PullRequest
0 голосов
/ 26 ноября 2018

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

private Bitmap SampleMethod(Bitmap bmpOriginal)
{
    BitmapData bmdo = null;
    Bitmap bm = null;
    BitmapData bmdn = null;

    try
    {
         bmdo = bmpOriginal.LockBits(new Rectangle(0, 0, bmpOriginal.Width, bmpOriginal.Height), ImageLockMode.ReadOnly, bmpOriginal.PixelFormat); 

         bm = new Bitmap(bmpOriginal.Width, bmpOriginal.Height, PixelFormat.Format1bppIndexed); 

         bmdn = bm.LockBits(new Rectangle(0, 0, bm.Width, bm.Height), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); 

         // Do some things with bmdo and bmdn objects

         bm.UnlockBits(bmdn); 
         bmpOriginal.UnlockBits(bmdo); 
    }
    catch (Exception e)
    {
         if (bm != null) bm.Dispose();
    }

    return bm; 
}

Какие объекты bmp мне нужно разместить здесь, bmp?Это не ясно для меня.Также я прочитал статьи, в которых люди не рекомендуют распоряжаться растровыми изображениями, которые возвращаются (это так).

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Ваш код неисправен.Вы не рассчитываете на успех, только на неудачу.Используйте блок finally для утилизации.Или еще лучше: используйте блок using.Даже если это приводит к использованию, вложенному в блок try.

Если он реализует IDisposeable, я бы всегда избавлялся от него.Даже если эта реализация класса ничего не делает, другая может.А некоторые классы (например, Streams) могут даже инкапсулировать друг друга.В то время как поток памяти вероятно совместно использует List - управляемый ресурс, который не нуждается в утилизации.Файловые и сетевые потоки Meahwile - это классические примеры вещей, которые необходимо утилизировать.Однако MemoryStream может также инкапсулировать FileStream.

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

Но, как сказал BWA, вы не можете располагать его в этом коде при возврате.Таким образом, код, вызывающий «SampleMethod» и получающий экземпляр, будет отвечать за удаление.

0 голосов
/ 26 ноября 2018

Если вы утилизируете объект, его внутренние ресурсы будут уничтожены, и объект станет непригодным для использования.Поэтому, если вы возвращаете такой объект, вы возвращаете непригодный объект.
Никогда не располагайте возвращаемый объект, неважно, какой тип.

И в catch

catch (Exception e)
{
     if (bm != null) bm.Dispose();
}

Установите null для bm, чтобы не возвращать поврежденный объект.

...