我有一个帮助器方法,它使用自己的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方法中处理它的处理是否更好?
答案 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会离开该方法,因此您不希望在其被调用者使用之后将其丢弃。那么,从逻辑上讲,调用者将负责处理它。