我创建了一个新的钢笔对象:
Private NewPen As New Pen(New SolidBrush(Color.FromArgb(12,52,220)))当我现在调用NewPen.Dispose时,它是否也释放了我用来创建笔的SolidBrush,还是必须单独处理它?
发布于 2014-11-29 10:27:59
不是的。在您的代码片段中的Private关键字是您正在犯错误的唯一真正提示。这意味着你把笔变成了一个类的字段。这从来都不是正确的做法,绘制对象创建起来非常便宜(大约1微秒),但保持在周围却很昂贵。它们被分配到桌面堆上,所有在该桌面上运行的程序都需要共享。你永远不想在那个堆里占据不必要的空间。
始终在需要时创建绘图对象。这让您在使用the语句时陷入了成功的深渊:
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框架总是努力将它们缓存起来。Font类就是一个很好的例子。
发布于 2014-11-29 10:21:14
简单的回答:,no,。钢笔类(单击查看.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 Usinghttps://stackoverflow.com/questions/27201027
复制相似问题