位图的辅助方法和正确处理 C#

eag*_*i22 1 .net c# bitmap

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

所以我返回一个克隆版本并将它传递给 Graphics 类的 DrawImage 像这样,

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

获取输入数据图像:

 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();
        }

 }
Run Code Online (Sandbox Code Playgroud)

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

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

Cla*_*07g 5

尝试从辅助方法返回位图对象本身,而不使用“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
Run Code Online (Sandbox Code Playgroud)

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

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