【发布时间】: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;的情况下停止关闭表单。