如何调试什么时候SaveFileDialog会被Dispose
今天又看到一个Coverity报出的问题,说SaveFileDialog
在使用完之后没有Dispose
。想起了之前写的一篇博文你知道Form.Show()和Form.ShowDialog()的区别吗?。那篇文章总结起来就是说,调用Form.Show()
不需要显示的Dispose
,但是调用Form.ShowDialog()
需要显示的Dispose
。那么回到今天的这个问题,SaveFileDialog
在使用完之后需要显示的Dispose
吗?如果看看MSDN的示例代码,其实它是没有显示Dispose
的。那究竟需不需要呢?
还是写段程序来检查一下吧,看看什么时候SaveFileDialog
会被Dispose
。写一个WinForm,然后加2个按钮,它们对应的响应事件如下:
1 | private void button1_Click(object sender, EventArgs e) |
然后在Visual Studio中加一个函数断点System.ComponentModel.Component.Dispose
,因为SaveFileDialog
继承自Component
,所以当SaveFileDialog
被Dispose
时,这个断点应该会被触发。
运行这个程序,点第一个按钮,点完之后发现断点没有被触发。这个时候关掉程序,发现断点被触发了,这个时候要注意看是不是SaveFileDialog
,因为好多都是从Component
继承下来的,也可以在断点上加一个条件,这样就比较容易观察了。这说明SaveFileDialog
在使用完后没有直接被Dispose
,一直呆到了程序结束。
再次运行这个程序,点第一个按钮,然后点第二个按钮,这是发现断点被触发了,说明GC会帮我们清理这个没用到的局部变量。
如果把上面代码中的Dispose
去掉注释,发现在第一个按钮按完之后就会被Dispose
了。
综上,对于SaveFileDialog
,我们还是应该在使用完后就显示的Dispose
。