【问题标题】:Calling Form.Close in Form.Closing在 Form.Closing 中调用 Form.Close
【发布时间】:2018-01-29 12:22:04
【问题描述】:

我的任务是清理我公司正在使用的应用程序。以前的开发人员已不在公司工作,我有一个问题。

在某种形式中,有一个 Form.Closing 方法。在这种方法中,编写了一些自定义代码。此方法的最后一行是Close(); 调用。查找来源时,它会返回到System.Windows.Forms.Form.Close

此代码示例如下所示:

private void Form1_Closing(object sender, CancelEventArgs e)
{

    // Some custom code here.

    Close();
}

在调试时,当代码到达Close(); 时,它会跳回到Form1_Closing 方法。这将导致以堆栈溢出结束的无休止的递归调用。现在,在 Windows 7 上,我有时会遇到 stackoverflow 错误。在 Windows 10 上不会发生这种情况。有谁知道为什么我的老同事把Close 调用放在Closing 方法中?

如果需要更多信息,我会尽力提供。现在我只是将Close 调用放在 cmets 中,一切似乎都像以前一样工作,现在在 Windows 7 上也没有偶尔的错误(stackoverflows)。

【问题讨论】:

  • 看来删除Close 调用是安全的。
  • Closing 事件由代码中调用的关闭命令或通过单击控制框中的 X 触发。开发人员可能希望通过调用 e.Cancel = True 来使用自定义代码取消关闭事件的关闭。除此之外,不应调用 close。
  • 我会认为在某些时候,它是为了执行在Form.Close() 方法中完成的逻辑。但是,需要在这两个地方执行的任何事情都应该重构为一个可以从两个地方调用的单独方法(取决于本机事件流的行为方式)。
  • 是否有可能在此代码重构中删除了覆盖的 Close() 函数?
  • 在调用Close(); 之前的某个条件中是否有return 语句?似乎试图在不使用 e.Cancel = true; 的情况下停止关闭表单。

标签: c# .net forms winforms


【解决方案1】:

当窗体即将关闭时触发关闭事件。您不必调用 close 方法,因为这是首先调用事件的方法。

如果您希望表单关闭,什么都不做,因为它会在退出关闭回调时关闭。

如果你想阻止它关闭,你可以写e.Cancel = True,它会阻止表单关闭。

您的大学可能调用了 close 方法,因为它有一个重载版本,但在某个时候被删除了。或者也许他/她也想关闭另一个表格。 重要的是,在这种情况下,您不需要调用该方法。

【讨论】:

    【解决方案2】:

    也许程序员不想关闭这个表单。只需要在 form_closure 中循环语句。 如果要关闭此表单,只需删除或注释 close() 即可。 如果要将资源返回到计算机,则需要将 Dispose() 放在此方法的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-07
      • 2012-10-14
      相关资源
      最近更新 更多