【问题标题】:Helper method for Bitmap and disposing correctly C#位图的辅助方法和正确处理 C#
【发布时间】:2017-10-17 07:46:29
【问题描述】:

我有一个辅助方法,它使用自己的 using 语句创建位图。最初我遇到的问题是,当返回由 using 语句控制的对象时,一旦离开范围,它将被处置。所以,在这个 article 的帮助下,我能够弄清楚这也是我的问题。

所以我返回一个克隆版本并将其传递给 Graphics 类的 DrawImage,如下所示,

g.DrawImage(getInputDataImage(dr.DRODAT, oFont, 430, 87, black, white, Color.Transparent), new Point(280, 23)); //DATE

获取输入数据图像:

 public static Image getInputDataImage(...
 {
        using(Bitmap bitmap = new Bitmap(width, height))
        using (Graphics graphics = Graphics.FromImage(bitmap))
        using(var format = new StringFormat{Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center})
        {
            //set coordinates on canvas to put barcode
            Point point = new Point(50, 50);

            RectangleF layoutRectangle = new RectangleF(new PointF(0, 0), new SizeF(bitmap.Width, bitmap.Height));
            graphics.Clear(color);
            graphics.DrawString(text, font, fontBrush, layoutRectangle, format);

            return (Bitmap)bitmap.clone();
        }

 }

DrawImage 会在它使用的类的析构函数中调用 dispose 吗?像这样使用时,我应该如何处理处理 Bitmap 类?在某些情况下,我调用 getInDataImage 辅助方法,每次都返回一个新对象。试图了解如何保持这种方式。

从帮助程序返回原始对象而不将其包装在 using 语句中并在 main 方法中处理它是否更好?

【问题讨论】:

    标签: c# .net bitmap


    【解决方案1】:

    尝试从辅助方法返回位图对象本身,不使用“using”语句,也不克隆它。

    在你的调用者中,创建一个新对象然后处理:

    using(Bitmap b = getInputDataImage(...))
    {
        g.DrawImage(b, new Point(...));
        // Do anything else I need to do with "b"
    }
    // "b" is now disposed of, I can't use it here
    

    当您使用“使用”时,一旦代码退出这些括号,您就会处理对象。因此,当您创建一个对象时,您希望它在使用时还活着,然后您想处置它。

    处理此问题的最佳方法是尽可能使用最高级别。在辅助方法中处理 Graphics 对象是有意义的,因为它永远不会离开该方法的范围。但是,您想要的 Bitmap 确实保留了该方法,因此您不想在其调用者使用它之前将其处理掉。因此,从逻辑上讲,调用者将负责处理它。

    【讨论】:

    • 啊,好吧,如果我这样做了,让我们说 5 个不同的 g.DrawImage(getInputDataImage()) 调用,正确的方法是为每个调用提供如上所示的 using 语句?
    • 是的,应该可以正常工作。请记住,如果它更有意义,您不必使用“使用”语句。您可以调用 Bitmap 的“Dispose()”方法。
    • 太好了,感谢您的解释。现在更清楚了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多