2011-07-06 25 views
0

在窗体上调用close并在其上再次调用close是安全的。第一次关闭后,没有其他任何操作正在进行。如果表单有两次关闭调用,这有什么关系吗?

我怀疑的是,这是不好的,它是有效的赛车GC调用第二紧密? (并赢得99.999%的时间,所以我没有看到任何错误)

编辑:要清楚这是恕我直言一个bug,但目前尚未造成任何异常被抛出。问题更多的是一个问题呢?我是否应该修复我找到的并且继续前进,因为它比较温和,或者我应该检查设计中的每个表单,以确保没有类似的问题,理由是没有异常可能取决于GC行为。

+0

你不应该调用它两次。您应该添加一个代码示例,在其中关闭它两次或者您认为它被调用了两次。如果它被处置或为空,我会期望有一个例外说明这一点。如果你现在没有例外,为什么要担心呢? – jlafay

回答

4

第二个调用不再会关闭本机窗口,它已经消失。它会再次调用Dispose()。这很好,所有.NET类都支持多次处理对象。

这都不是什么做的垃圾收集器,显然你还是要形式对象的引用,不然你不会已经能够调用Close()。不要永远保留这个引用,否则你会泄露表单对象。它是死的,不能复活。引用该表单对象的成员往往会抛出ObjectDisposedException。

+0

权,所以没有什么大不了的事情的非托管资源,但第二紧密可能会抛出异常,我认为这个回答我的问题 –

+0

我想我的一些混乱,这里是MSDN上的ObjectDisposedException条件的form.close描述 –

0

调用一个已经关闭的窗体上Close()提出了一些设计问题,你应该重新考虑。但是,我不知道这会导致任何问题。

您可以使用反射器来查看确切的结果。但我很确定它会检查表单是否真正打开。

0

没有办法知道GC在做什么。如果你有一个表格并且在它上面调用Close()两次,并且没有抛出异常(空或者抛出),那么问题在哪里?不会有任何“赛车”状况。

我的问题是,“为什么有2点close的调用()摆在首位?”

1

它应该是固定的,但它可能不是一个重要的优先事项。问题在于,在对应用程序进行修改或使用更新版本的.net之后,它可能会在未来导致异常或奇怪的行为。换句话说,这是不安全的。

相关问题