Pen.Dispose处理底层画笔吗?

Jen*_*ens 4 c# vb.net gdi+

我创建了一个新的Pen对象:

Private NewPen As New Pen(New SolidBrush(Color.FromArgb(12,52,220)))
Run Code Online (Sandbox Code Playgroud)

当我现在打电话的NewPen.Dispose时候,它还处理SolidBrush我用来制作笔的笔,或者我是否必须单独处理它?

Han*_*ant 7

不.您的代码段中的Private关键字是您犯错误的唯一真实提示.这意味着你使笔成为一个类的领域.这绝对不是正确的事情,绘制对象创建起来非常便宜(大约一微秒)但保持昂贵.它们在桌面堆上分配,该桌面上运行的所有程序都需要共享.你永远不想在那堆不必要地占据空间.

始终在需要时创建绘图对象.这使您可以使用Using语句陷入成功之中:

Protected Overrides Sub OnPaint(e As PaintEventArgs)
    Using sbr = New SolidBrush(Color.FromArgb(12, 52, 220))
        Using pen = New Pen(sbr)
            '' Use the pen
            ''....
        End Using
    End Using
 End Sub
Run Code Online (Sandbox Code Playgroud)

对于许多程序员来说,这往往是非常不直观的,他们通常知道保持对象并重新使用它们是一件好事.您需要记住的一般规则是,一次性物体通常是相反的.有些类型的对象创建起来很昂贵,所以似乎值得保留它们.然而,.NET Framework总是努力缓存它们本身.Font类就是一个很好的例子.