是否在.NET中放置位图?

时间:2018-11-26 14:48:25

标签: c# bitmap bitmapdata

在很多情况下,我怀疑是否需要处理位图对象。当我必须从一种方法中返回位图时,我怀疑是否有必要的一种情况如下:

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 :(得分:1)

如果处置对象,则内部资源将被破坏并且对象将无法使用。因此,如果返回此类对象,则返回不可用的对象。
永远不要处置返回的对象,不要介意什么类型。

catch

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

null的{​​{1}}设置为不返回损坏的对象。

答案 1 :(得分:0)

您的代码有误。您不是在处理成功,而是在处理失败。使用finally块进行处理。或更妙的是:使用using块。即使这样会导致将使用嵌套在try块中。

如果它实现IDisposeable,我将始终对其进行处理。即使该类的实现在那里不执行任何操作,也可能会执行另一个操作。有些类(例如Streams)甚至可以相互封装。虽然内存流在内部使用列表适当地 ,但是托管资源不需要处理。 Meahwile文件和网络流是必须处置的经典示例。但是,MemoryStream也可以封装FileStream。

类可能具有占用可处置资源的可选字段。仅仅因为您现在不遇到问题,并不意味着您永远不会。如果它实现IDisposeable,那么假设您将需要调用它。

但是正如BWA所说,您不能在返回代码时将其处置在此代码中。因此,调用“ SampleMethod”并获取实例的代码将负责Dispose。