Bitmap的Helper方法和正确处理C#

时间:2017-05-17 17:52:21

标签: c# .net bitmap

我有一个帮助器方法,它使用自己的using语句创建一个位图。最初我遇到了一个问题,当返回由using语句控制的对象时,一旦范围被放置就会被处理掉。所以,在article的帮助下,我能够发现这也是我的问题。

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

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

getInputDataImage:

 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会调用它在其使用的类中的析构函数吗?我这样使用时如何处理Bitmap类?在某些情况下,我调用getInDataImage辅助方法,每次都返回一个新对象。试图了解如何以这种方式维护处理。

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

1 个答案:

答案 0 :(得分:4)

尝试从helper方法返回位图对象本身而不使用“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

使用“使用”时,一旦代码退出这些括号,就会丢弃对象。因此,当您创建一个对象时,您希望它在使用时保持活动状态,然后您想要处置它。

处理此问题的最佳方法是尽可能最高级别。在helper方法中处理Graphics对象是有意义的,因为它永远不会离开该方法的范围。但是,您想要的Bitmap会离开该方法,因此您不希望在其被调用者使用之后将其丢弃。那么,从逻辑上讲,调用者将负责处理它。