4

背景

在 Visual Studio 2008 中创建一个新的 Windows 窗体应用程序,这将创建一个带有名为“Form1”的类的骨架项目。VS2008 会自动创建一个 Dispose() 方法。

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

我走进一个同事的办公室(一位高级开发人员) - 很棒的人,聪明,良好的聊天设计技巧 - 但我注意到他在输入什么 - 当他浏览代码库时,他删除了 VS2008 创建的 Dispose() 方法的这一部分对于表格。

        if (disposing && (components != null))
        {
            components.Dispose();
        }

所以,我问他为什么,他说没有必要保留它。

问题

  • 删除此代码是否安全?
  • 将其留在或删除它的优点/缺点是什么?
4

2 回答 2

7

不,删除此代码是不安全的。几个组件依赖于这种模式才能生效,以便正确释放它们持有的非托管资源。如果您删除此代码,您的应用程序可能会在 95% 的时间内正常工作。不过,这 5% 的情况将显示为资源泄漏、潜在的内存泄漏、非确定性错误……一般来说,很难追踪问题。

处理一次性资源的最佳方法是在您不再使用它的那一刻进行处理。遵循这种做法将为您省去很多麻烦。删除此代码采用完全相反的方法。

这篇关于 SO 的帖子包含更详细的解释:我什么时候应该在 .NET 中处理我的对象?

于 2008-12-20T07:14:30.863 回答
5

如果您在表单上使用过 System.Windows.Forms.Timer 之类的东西,绝对不要删除它。而且总是有这样的机会。

正是这段代码将在表单关闭时释放计时器,如果您不释放计时器,它将继续运行。我已经接管了一些引入了此类错误的代码(在 .NET 2.0 之前,这种机制并不能很好地工作),并且由于计时器在它们应该更新的表单关闭后长时间运行而导致的间歇性性能问题可能是一个真正的痛苦。

删除它并没有实际的好处——如果没有控件将自己添加到组件列表中,那么 components.Dispose() 将很容易运行。如果控件已将自己添加到列表中,那是因为它们应该被处置。

于 2008-12-20T08:19:32.950 回答