【问题标题】:What would be a good time for my modeless form to dispose of itself?什么是我的无模式形式自行处理的好时机?
【发布时间】:2012-02-25 06:02:49
【问题描述】:

我有一个无模式的表格。当用户完成它并Close它时,不再需要表单(及其相关资源)。

正确的编程要求我处理任何实现 IDisposable 的东西(即我不能等待垃圾收集运行)。这包括我自己,一个 WinForms Form

表单调用Dispose 自身的最佳或有效时间是什么时候?

在“其他”语言中,您可以从表单中销毁表单 自己调用Release:

void CloseButton(EventArgs e)
{
   this.Release();
}

此方法会导致表单在每个实例之后被销毁 方法已返回(并且表单已处理所有待处理的消息)。

在这种“其他”语言中,大错特错

void CloseButton(EventArgs e)
{
   this.Free();
}

因为我正在从我自己下面释放我正在运行方法的对象; 这会暂时导致访问冲突。

假设调用它是危险的无效:

void CloseButton(EventArgs e)
{
    this.Dispose();
}

但也许打电话是安全的:

void FormClosed(EventArgs e)
{ 
   this.Dispose();
}

当不再需要无模式表单时,它的自我清理指南是什么?

【问题讨论】:

    标签: winforms idisposable


    【解决方案1】:

    事实证明,您甚至不需要 在无模式表单上调用 Dispose。来自 MSDN:

    Form.Close Method

    当窗体关闭时,对象内创建的所有资源 关闭并处理表格。您可以防止关闭表单 在运行时通过处理Closing 事件并设置 CancelEventArgsCancel 属性作为参数传递 到您的事件处理程序。如果您要关闭的表格是启动表格 你的应用程序,你的应用程序结束。

    Close 不处理表单的两种情况是:

    1. 它是多文档界面 (MDI) 应用程序的一部分,并且表单不可见
    2. 您已使用ShowDialog 显示表单。

    在这些情况下,您需要手动调用Dispose 来标记 用于垃圾收集的所有表单控件。

    所以回答我的问题,“我的无模式表单什么时候可以自行处理?”

    答案:从不

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-17
      • 2019-06-15
      • 1970-01-01
      • 2012-03-15
      • 2018-01-11
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多