Brush b = new SolidBrush(color);
Pen p = new Pen(b);
然后像这样处理它们:
b.Dispose();
p.Dispose();
如果有以下代码:
Pen p = CreatePenFromColor(color)
,它会为您创建画笔和笔刷,那么您该如何处置它呢?我不能在此方法内部处理掉刷子,对吗?这是一个不适用于可处理对象的方法吗?
编辑:我的意思是,你如何处理掉BRUSH?
Brush b = new SolidBrush(color);
Pen p = new Pen(b);
然后像这样处理它们:
b.Dispose();
p.Dispose();
Pen p = CreatePenFromColor(color)
,它会为您创建画笔和笔刷,那么您该如何处置它呢?我不能在此方法内部处理掉刷子,对吗?CreatePenFromColor方法的工作是处理Brush实例的释放。一眼看上去并不明显,但如果深入到Pen类的实现中,您会发现它并没有保留传入的Brush实例。相反,它只是用它来计算一些值。因此,Brush实例在调用CreatePenFromColor后没有存在的理由,该方法应该处理实例的释放。
GdipCreatePen2
。我不知道GdipCreatePen2
是否需要保持刷子处于活动状态(该函数几乎没有文档),但我猜测它会这样做。请记住,刷子可以是带有图像的TextureBrush
,您不希望笔在内存中制作图像的单独副本,以便您可以处理刷子。 - SLaksusing (Pen p = CreatePenFromColor(color))
{
// do something
}
public Pen CreatePenFromColor(Color c)
{
using (Brush b = new SolidBrush(c))
{ return new Pen(b); }
}
问题b. 为什么不直接使用Pen(Color color)?
public Pen CreatePenFromColor(Color c)
{
return new Pen(c);
}
c. (关于评论)如果笔在内部保留了对刷子的引用,则在您完成使用笔之前,您将无法处理它。在这种情况下,我会选择一个可以为我完成工作的类:
public class PenHelper : IDisposable
{
private readonly Brush _brush;
public PenHelper(Color color)
{
_brush = new SolidBrush(color);
}
public Pen CreatePen()
{
return new Pen(_brush);
}
public void Dispose()
{
_brush.Dispose();
}
}
using (PenHelper penHelper = new PenHelper(Color.Black))
{
using (Pen pen = penHelper.CreatePen())
{
// do stuff
}
}
声明:IDisposable并未按照指南实现,而仅用于演示。此外,整个示例仅用于展示如何在需要时封装引用。当然,你应该选择Pen(color)。
你的问题没有通用的解决方案。
在你的具体例子中,这不是一个问题,因为Pen有一个直接接受Color参数的构造函数。
一些类会自行处理它们的构造函数参数(尤其是与流相关的类); 检查Reflector中的每个类。
如果你返回的类继承自Component,则可以向其Disposed事件添加处理程序。
如果你返回的类没有被封装,那么你可以创建一个继承版本,它也将释放你从中创建对象的构造函数参数。
最后,如果你真的想这样做,你可以创建一个包装类,其中包含你要返回的对象并释放构造函数参数。然而,那将非常令人困惑,我不建议这样做。
我对许多与图形相关的类之一的不满是,它们没有处理此类问题的一致模式。真正需要的是一种实现部分引用计数的方法。这不是COM风格,其中传递引用需要不断增加引用计数,而是通过一个IDisposable图形对象,可以请求另一个共享相同底层资源的实例。资源本身将封装在具有引用计数器的共享对象中。创建另一个引用实例将增加计数器;在引用实例上调用Dispose将减少它。这将避免95%的引用计数开销,同时保留99%的好处。