我有一个辅助方法,它使用自己的 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 方法中处理它是否更好?
请您参考如下方法:
尝试在不使用“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
当您使用“using”时,一旦代码退出这些括号,您就释放了该对象。因此,当您创建一个对象时,您希望它在使用时处于事件状态,然后您想要处置它。
处理此问题的最佳方法是在尽可能高的级别。在辅助方法中处理 Graphics 对象是有意义的,因为它永远不会离开该方法的范围。但是,您想要的 Bitmap 确实保留了该方法,因此您不想在调用者使用它之前处理它。那么,从逻辑上讲,调用者将负责处理它。
