Joa*_*nge 7 .net c# garbage-collection idisposable
如果你有一个画笔和笔,如:
Brush b = new SolidBrush(color);
Pen p = new Pen(b);
Run Code Online (Sandbox Code Playgroud)
并像这样处理它们:
b.Dispose();
p.Dispose();
Run Code Online (Sandbox Code Playgroud)
如果是这样的话你将如何处置它:
Pen p = CreatePenFromColor(color)哪个会为你创造画笔和笔?我不能把刷子放在这个方法里面吧?
这是一种不能与一次性物品一起使用的方法吗?
编辑:我的意思是,你如何处置BRUSH?
处理Brush实例是CreatePenFromColor方法的工作.它一目了然并不明显,但如果你深入研究Pen类的实现,你会发现它不会保留传入的Brush实例.相反,它只是用它来计算一些值.所以没有理由让Brush实例超出对CreatePenFromColor的调用,并且该方法应该处理实例.
完成后你仍然需要处理它.
例如,你可以像这样调用它:
using (Pen p = CreatePenFromColor(color))
{
// do something
}
Run Code Online (Sandbox Code Playgroud)
如果方法返回IDisposable对象,则有责任处置它.
[编辑]现在我得到了一个问题 - 你正在使用Pen(Brush b)构造函数.
一个.在这种情况下,似乎Pen在构造函数之后不需要Brush实例,因此您的方法可能如下所示:
public Pen CreatePenFromColor(Color c)
{
using (Brush b = new SolidBrush(c))
{ return new Pen(b); }
}
Run Code Online (Sandbox Code Playgroud)
湾 为什么不简单地使用笔(颜色)?
public Pen CreatePenFromColor(Color c)
{
return new Pen(c);
}
Run Code Online (Sandbox Code Playgroud)
C.(关于注释)如果Pen在内部持有对Brush的引用,那么在完成Pen之前你将无法处理它.在那种情况下,我会选择一个可以帮我完成工作的课程:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
然后像这样使用它:
using (PenHelper penHelper = new PenHelper(Color.Black))
{
using (Pen pen = penHelper.CreatePen())
{
// do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
免责声明:IDisposable不是根据指南实施的,而是仅用于演示.此外,整个示例仅用于说明如何在需要时封装引用.你应该去Pen(颜色)当然.