我正在研究用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对象以防止内存泄漏,但由于该类是静态的,这是不同的情况吗?
我不想实现这个库并在未来遇到内存问题
答案 0 :(得分:3)
首先,当使用Bitmaps时,如果您希望使用多个线程,我会警告不要在静态类中使用它们。一次不能有多个线程使用位图。例如,如果您接下来在一个线程中执行此操作:
using(Graphics g = Graphics.FromImage(bmpCrop)
{
// do something
}
和另一个
int w = bmpCrop.Width
您将获得无效的参数异常。
接下来,在您的示例中,我看到三个图像实例...
现在你没有在这个函数中处理bmpImage并且需要。 在此调用之后,调用者在某些时候有责任处置img和bmpCrop
答案 1 :(得分:1)
静态不会改变处置要求(作为一般规则)。您必须考虑的是,在静态方法完成后,Bitmap
将使用。因此,例如,如果您将Bitmap
退出函数,那么您不想丢弃它,因为您预计其他人(其他一些代码)将需要使用它因此处理它成为他的责任。
但是,方法本身是静态的这一事实没有任何意义,如果你在非静态方法中处理它,你应该用静态方法处理它。