Pen.Dispose释放底层的笔刷吗?

5
我创建了一个新的笔对象:
Private NewPen As New Pen(New SolidBrush(Color.FromArgb(12,52,220)))

现在当我调用NewPen.Dispose时,是否也会处理我用来创建笔的SolidBrush,还是我必须单独处理它?

2个回答

7
不。在您的代码片段中,Private关键字是您犯错误的唯一真正提示。这意味着您将笔作为类的字段。这从来不是正确的做法,绘图对象非常容易创建(约为1微秒),但保留它们很昂贵。它们被分配在桌面堆上,所有在该桌面上运行的程序都需要共享该堆。您永远不希望无端占用该堆中的空间。
始终在需要时创建绘图对象。这使您可以使用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

对许多程序员来说,这可能不太直观,他们通常学习保留对象并重复使用是一件好事。需要记住的一般规则是,对于可丢弃对象,通常情况是相反的。有些类型的对象创建起来很昂贵,因此似乎值得保留它们。然而,.NET Framework总是会尽力自己缓存它们。Font类就是一个很好的例子。


是的,我确实想在自定义控件中保留笔和画刷,以避免每次绘制时重新创建它们。我想我会改变这一点。谢谢。 - Jens

3
简单回答:不行。Pen 类(点击查看 .net 源代码)不存储任何对刷子的引用。您需要负责处理刷子的释放。这就是为什么此代码返回 False 的原因:
Using b As New SolidBrush(Color.Black)
    Using p As New Pen(b)
        Debug.WriteLine("Is equal: {0}", (b Is p.Brush))
    End Using
End Using

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接