【问题标题】:Do I need to dispose of Bitmap instances used in a static method of a static class?我是否需要处理静态类的静态方法中使用的 Bitmap 实例?
【发布时间】:2012-01-25 20:46:55
【问题描述】:

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

例如crop方法:

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

我知道通常需要对 Bitmap 对象进行处理以防止内存泄漏,但这是因为类是静态的而不同吗?

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

【问题讨论】:

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


    【解决方案1】:

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

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

    还有一个

    int w = bmpCrop.Width
    

    你会得到一个无效的参数异常。

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

    • 图片
    • bmpImage
    • bmpCrop

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

    【讨论】:

      【解决方案2】:

      静态不会改变处置的要求(作为一般规则)。您必须考虑的是静态方法完成后是否会使用Bitmap。因此,例如,如果您将 Bitmap 从函数中返回,那么您不想处理它,因为您预计其他人(其他代码)将需要使用它,并且所以处理它成为他的责任。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        相关资源
        最近更新 更多