以下摘录摘自this MSDN page上ComboBox::DrawItem
实施的示例:
e.Graphics.FillRectangle(new SolidBrush(animalColor), rectangle);
我对这部分提出质疑:new SolidBrush(animalColor)
由于这既不是故意给出Dispose
也不是包含在using
中,我认为这也是一个不良形式的例子,因为SolidBrush
对象将被创建并且永远不会被处置。
我一直在假设我必须直接使用上述处理机制之一,或者冒着内存泄漏的风险。
我是否正确,或者是否有一些我不知道的更深层次的隐性处理?也许是因为它从未被分配给变量?
答案 0 :(得分:4)
它应该在using
语句中,或者应该明确地调用Dispose
,但是,
SolidBrush
类继承了Brush
类,其析构函数/ finalize定义为:
来自here:
的来源 /**
* Object cleanup
*/
/// <include file='doc\Brush.uex' path='docs/doc[@for="Brush.Finalize"]/*' />
/// <devdoc>
/// <para>
/// Releases memory allocated for this <see cref='System.Drawing.Brush'/>.
/// </para>
/// </devdoc>
~Brush()
{
Dispose(false);
}
一旦您的类SolidBrush
的对象超出范围,最终将调用其析构函数。此时Dispose
将被称为释放任何未受管资源。
请参阅:Destructors (C# Programming Guide)
析构函数隐式调用了基类的Finalize 对象
依赖于析构函数/终结器的唯一问题是,您无法预测何时最终会处置该对象。
答案 1 :(得分:1)
我应该说这是msdn的一个糟糕的例子。你应该Dispose
它;没有任何对象会自动处理。
它不一定是泄漏,Brush
实现了Finalizer
,当收集垃圾时它会Dispose
,但你不应该依赖它。
答案 2 :(得分:0)
与所有托管对象一样,它会自动释放。这是了解.NET和C#的关键方面。
但是,可能无法及时完成。由于这个对象使用的是系统资源,我实际上并不认为这是一个好形式的例子。
答案 3 :(得分:0)
应该处理该对象,是的。
这就是说,如果这样做非常不方便,不要处理某些轻质物品是一种有效的行动方案。 Task
是一个很好的例子。 WPF中的SolidColorBrush
可能相当轻松。如果你确定不要“泄漏”太多这些代码就可以了。
请注意,在此处添加处理机制(例如using
)会使代码混乱。这样做显然是一个(小)缺点。