是否“笔”处理“处理底层画笔

本文关键字:处理 画笔 是否 | 更新日期: 2023-09-27 18:32:35

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

Private NewPen As New Pen(New SolidBrush(Color.FromArgb(12,52,220)))

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

是否“笔”处理“处理底层画笔

No. 代码段中的 Private 关键字是您犯错的唯一真实提示。 这意味着你把笔变成了一个类的字段。 这从来都不是正确的做法,绘制对象的创建成本非常低(大约一微秒(,但保留起来却很昂贵。 它们被分配到桌面堆上,在该桌面上运行的所有程序都需要共享该堆。 您永远不想不必要地占用该堆中的空间。

始终在需要时创建图形对象。 这让你陷入了使用语句的成功坑:

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 类就是一个很好的例子。

简单的答案:。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