我有一个辅助方法,它使用自己的 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 方法中处理它的处置是否更好?
尝试从辅助方法返回位图对象本身,而不使用“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 确实会离开该方法,因此您不想在调用者使用它之前处理它。因此,从逻辑上讲,调用者将负责处理它。