为什么要在表单上放置标准对话框?

时间:2010-07-27 20:09:26

标签: c# .net winforms forms

我在C#,。Net 2.0中有一些遗留代码,有人将OpenFileDialog和SaveFileDialaog从工具箱拖到窗体上。这会导致打开和保存对话框在创建父对话框时实例化,并保持到父对话框关闭为止。打开/保存表单实际上仅用于一个位置,每个位置用于在父对话的生命周期内不总是打开/保存的支持文件;这对我来说似乎效率低下。 我会做的是:

    using (OpenFileDialog openDlg = new OpenFileDialog() )
    {
        //initialize openDlg...

        if (openDlg.ShowDialog() != DialogResult.OK)
        {
            //handle OK result
        }
    }

这样,当using语句超出范围时,OpenFileDialog将被处理掉。除非我遗漏了某些东西,否则资源的快速处理(以及更快的垃圾收集)的价值超过了在需要时不必实例化打开/保存文件对话框的小额节省。 即使每次使用父对话框时都使用了打开/保存对话框,我也没有看到任何时候使用它们的重要价值。我的问题是我错过了什么?是否有更高的效率始终保持打开/保存对话框? 我假设所有其他标准对话框的答案都是相同的:ColorDialog,FolderBrowserDialog和FontDialog。

7 个答案:

答案 0 :(得分:4)

没必要。这些对话框只有Dispose()方法,因为它们从Component类继承。它们不会覆盖该方法,因为它们实际上没有任何可处理的东西。当对话框关闭时,它们使用的所有系统资源都会被释放。 Component.Dispose()实现也没有进行任何处理,它只是确保从IContainer集合中删除该组件。

这是这些对话框包装器的实现细节。其他组件通常用于Dispose(),ToolTip就是一个很好的例子。表单的自动生成的Dispose方法确保发生这种情况,请查看表单的Designer.cs源代码文件中的“components”字段。这就是为什么Component有一个Dispose方法,默认情况下不会做任何重要的事情。

避免在表单上删除组件有一个很小的好处,它允许对话框的.NET包装类被垃圾收集。但是,保存的千字节是微观优化。

从表面上看这个:如果早期处理这些类对象很重要,那么微软就不会将它们作为组件。

答案 1 :(得分:2)

我认为“on form”选项对新手来说应该更容易实现,因为这项工作主要是在编辑器而不是代码中。

答案 2 :(得分:1)

好的做法是做你做的事情,因为你已经声明这些对话框不需要在内存中存放很长时间,但如果它们被多次使用,最好留下它在应用程序关闭时正确处理它,完全取决于具体情况。

鉴于这种情况,这听起来好像你走得很好,我不会在它上面失去多少睡眠,但无论它是否有任何有用的处理方法,推荐使用它的方式,这只是一个很好的做法。

答案 3 :(得分:0)

优点是您可以在表单设计器中设置对话框(多选,初始目录,扩展名)等。

表单设计器也可以很容易地将OpenFileDialog拖到您的表单上,而许多开发人员只是这样做。不能真的怪他们。

这两种方法都没有明显的优势或劣势,我怀疑你会发现任何可察觉的性能差异。

答案 4 :(得分:0)

当我想要保留某些设置(例如过滤器)时,我通常会创建表单范围对话框,而不必在每个使用对话框的位置设置它们。如果对话框仅在一个地方使用,我使用using语句,如上所述。

答案 5 :(得分:0)

我总是想知道这种方法以及我更喜欢你的代码段中的使用模式。我能够想出的唯一可能的原因是,通过制作它们的组件,可以在设计器中配置它们的属性。

不是一个非常令人信服的理由(恕我直言)。

答案 6 :(得分:0)

我普遍同意。但是如果对话框有很多“默认”属性数据,那么可能会有轻微的性能提升。考虑一个包含50个文件类型过滤器的文件打开对话框。