我是否需要处理静态类的静态方法中使用的Bitmap实例?

时间:2012-01-25 20:46:55

标签: c# .net image memory-leaks bitmap

我正在研究用C#编写的小型Image Cropping和Resizing库。它由一个静态类组成,其中包含用于调整大小和裁剪功能的静态方法。

例如裁剪方法:

public static Image Crop(Image img, Rectangle cropArea)
{
    var bmpImage = new Bitmap(img);
    var bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
    return bmpCrop;
}

我知道通常需要处理Bitmap对象以防止内存泄漏,但由于该类是静态的,这是不同的情况吗?

我不想实现这个库并在未来遇到内存问题

2 个答案:

答案 0 :(得分:3)

首先,当使用Bitmaps时,如果您希望使用多个线程,我会警告不要在静态类中使用它们。一次不能有多个线程使用位图。例如,如果您接下来在一个线程中执行此操作:

using(Graphics g = Graphics.FromImage(bmpCrop)
{
   // do something
}

和另一个

int w = bmpCrop.Width

您将获得无效的参数异常。

接下来,在您的示例中,我看到三个图像实例...

  • img
  • bmpImage
  • bmpCrop

现在你没有在这个函数中处理bmpImage并且需要。 在此调用之后,调用者在某些时候有责任处置img和bmpCrop

答案 1 :(得分:1)

静态不会改变处置要求(作为一般规则)。您必须考虑的是,在静态方法完成后,Bitmap使用。因此,例如,如果您将Bitmap退出函数,那么您不想丢弃它,因为您预计其他人(其他一些代码)将需要使用它因此处理它成为他的责任。

但是,方法本身是静态的这一事实没有任何意义,如果你在非静态方法中处理它,你应该用静态方法处理它。