在很多情况下,我怀疑是否需要处理位图对象。当我必须从一种方法中返回位图时,我怀疑是否有必要的一种情况如下:
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?我不清楚。另外,我读过一些文章,人们不建议放置返回的位图(是这种情况)。
答案 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。