2011-10-03 69 views
3

.NET Framework(和OpenFileDialog)中的FolderBrowserDialog组件实现IDisposible接口,这意味着我们应该在我们完成处理或发生不好的事情(非托管资源泄漏)后的某个适当时间调用其方法Dispose我是否必须在FolderBrowserDialog上调用Dispose方法?

在Visual Studio WinForm设计,如果我将一个FolderBrowserDialog组件到窗体上,由设计器生成的代码似乎没有照顾这在所有,任何代码调用FolderBrowserDialog Dispose方法。

相反,如果我拖动Timer(中System.Windows.Forms命名空间一个),这也实现了IDisposible接口,所生成的代码将是:

this.components = new System.ComponentModel.Container(); 
this.timer1 = new System.Windows.Forms.Timer(this.components); 

由计时器与所述容器(this.components关联),当容器被丢弃时,定时器被保证妥善处理 - 当调用Form.Close()Form.Dispose()时发生。

那么为什么FolderBrowserDialog组件接受这种特殊待遇?

+2

所有的shell对话框类包装只有一个Dispose()方法,因为它们从它们的Component基类继承了一个。它们实际上并不需要处理,当本机对话框关闭时,它们的非托管资源将在内部处理。 @thecoop正确地解释了他们如何避免Dispose()被调用。 –

+0

嗨Hans(nobugz),很高兴见到你。看着Reflector,我在FolderBrowserDialog的RunDialog方法中找到对NativeWindow.DestroyHandle()的调用,所以我认为你是对的。 – kennyzx

回答

3

好点!原因可能是FolderBrowserDialog未提供采用​​参数的构造函数,而Timer则提供此参数。至于为什么这样,你只能问原始的winforms设计师。也许它不是真的被设计用于这种设计?他们只意味着它被用在using声明中的代码中?

记住,FolderBrowserDialog,其父母,并没有真正从Component覆盖Dispose,所以它实际上并不需要处置任何东西。

相关问题