如何处理我们没有参考的一次性物品?

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?

Jar*_*Par 9

处理Brush实例是CreatePenFromColor方法的工作.它一目了然并不明显,但如果你深入研究Pen类的实现,你会发现它不会保留传入的Brush实例.相反,它只是用它来计算一些值.所以没有理由让Brush实例超出对CreatePenFromColor的调用,并且该方法应该处理实例.


Gro*_*roo 6

完成后你仍然需要处理它.

例如,你可以像这样调用它:

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(颜色)当然.