我需要调用FolderBrowserDialog上的Dispose方法吗?

3

.NET Framework中的FolderBrowserDialog组件(以及OpenFileDialog)实现了IDisposable接口,这意味着我们应该在完成使用后或发生某些错误(未管理的资源泄漏)时调用其Dispose方法。

在Visual Studio WinForm设计器中,如果我将FolderBrowserDialog组件拖到表单上,设计器生成的代码似乎完全没有考虑到这一点,没有任何代码调用FolderBrowserDialogDispose方法。

相比之下,如果我拖动一个实现了IDisposable接口的Timer(位于System.Windows.Forms命名空间中),生成的代码将是:

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()。 - Hans Passant
嗨,Hans(nobugz),很高兴在SO上见到你。研究Reflector时,我发现FolderBrowserDialog的RunDialog方法中调用了NativeWindow.DestroyHandle(),所以我认为你是正确的。 - kennyzx
1个回答

3
不错!原因很可能是FolderBrowserDialog没有提供带有IContainer参数的构造函数,而Timer提供了。
至于为什么会这样,只能问最初的winforms设计者。也许它并不是真正设计成以这种方式在设计器中使用?他们只是想让它在using语句中在代码中使用?
请注意,FolderBrowserDialog及其父项实际上没有覆盖来自ComponentDispose,因此它实际上不需要处理任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接