是使用"内联"创建的对象?新声明自动处理?

时间:2015-01-27 19:11:35

标签: c#

以下摘录摘自this MSDN pageComboBox::DrawItem实施的示例:

e.Graphics.FillRectangle(new SolidBrush(animalColor), rectangle);

我对这部分提出质疑:new SolidBrush(animalColor)

由于这既不是故意给出Dispose也不是包含在using中,我认为这也是一个不良形式的例子,因为SolidBrush对象将被创建并且永远不会被处置。

我一直在假设我必须直接使用上述处理机制之一,或者冒着内存泄漏的风险。

我是否正确,或者是否有一些我不知道的更深层次的隐性处理?也许是因为它从未被分配给变量?

4 个答案:

答案 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)会使代码混乱。这样做显然是一个(小)缺点。