Form.ShowDialog()和处置(Form.ShowDialog() and dispose

2019-07-30 09:30发布

如果我有这样的方法:

public void Show()
{
   Form1 f = new Form1();
   f.ShowDialog();
}

我仍然需要调用处理 ,即使它会走出去的范围的形式,这将是符合垃圾回收上。

从一些测试,调用此展()多次..在某些时候它好像GC收集它,因为我可以看到内存扣球则下降在某个时间点。

从MSDN好像说,你必须调用时,不再需要的形式处理。

Answer 1:

在您的具体的例子,不,这是不可能的,这将是特别有用。 表格不保留资源显著量,所以如果它需要长一点的它的某些部分的代码将得到清理它不会引起问题。 如果这种形式恰好是持有到用来,比如说控制,播放视频,那么也许它的实际持有到一些资源显著数,如果你实际上在Dispose方法处置这些资源的那么值得抽空打电话处理。 对于你的表格99%,虽然,他们的Dispose方法将是空的,以及你是否打电话与否不太可能有任何(或任何明显的)对你的程序的影响。

它的存在主要是为了使案件的1%,其中很重要的是配置资源的能力的原因。

另外值得一提的是,当Form关闭时,其Dispose已经被调用的方法。 你永远只能需要添加一个using或显式Dispose调用,如果你想关闭该窗体前处置的形式的资源。 (这听起来像一个普遍不好的想法对我来说)。 这是很容易测试。 只要创建两种形式的项目。 有第二种形式附加一个事件处理程序Disposing事件,并显示一个消息框或东西。 然后,当您创建窗体的实例并显示它(如一个对话框或没有),你会看到,当您关闭消息框弹出向右走,即使你保持“形式”的实例和身边没有你以往需要添加usingDispose呼叫。



Answer 2:

什么往往发生的是,如果该项目已纯粹管理资源,调用dispose不一定必需的 ,但强烈建议 ,因为它使处置确定性 。 它并不总是需要(在技术意义上),因为这些管理资源将有可能自己现在有资格GC,或实际上没有什么默认处置,它的可扩展性点。

对于非托管资源的Dispose模式建议实施一个终结 ,这将在GC被调用。 如果类型不执行终结和处置不叫,那么有可能 (当然,非常有可能),其资源将离开未处理。 终结是运行时清除你的东西了提供了最后的机会 - 他们也是有时间限制的。

请注意,它不会使GC或托管内存回收确定性,处置 delete从C ++。 已释放的项目可能是一个很长的路要走远离实际收集。 然而,在管理世界里,你不关心确定性的集合,唯一的资源管理 - 换句话说,处置。

这就是说,我总是确保我调用Dispose或使用using语句如果一个类型是一次性的, 不管它是否使用托管或非托管的资源-这是预期的约定:

public void Show()
{
    using (var f = new Form1())
    {
        f.ShowDialog();
    } // Disposal, even on exceptions or nested return statements, occurs here.
}

更新:

与Servy我觉得讨论后,我有表达这一点背后处置我在可能的建议的理由。 在的情况下MemoryStream ,这显然是一个一次性的类型,但实际上目前并没有出售任何东西。

就凭这,然而,是依靠执行 MemoryStream 。 这被更改为包括非托管资源,这将意味着再上一个依赖MemoryStream没有任何处置变得困难。

如果可能的话(这是与本案IDisposable ),我宁愿依靠公众合同 。 针对在这种情况下,合同工作将意味着我是从底层实现的改变是安全的。



Answer 3:

虽然你很少有在C#中手动配置海事组织,你可以尝试这样的:

    public void Show()
    {
       using (Form1 f = new Form1())
       {
         f.ShowDialog();
       }
    }

然后,在使用部分的最后荣誉将得到处置自动。



Answer 4:

你可以简单地做:

using (var f = new Form1())
   f.ShowDialog();


Answer 5:

如果你想明确地处置,使用

 using(Form1 f = new Form1()){

            f.ShowDialog();
        }

这确保Dispose()方法,因为它会立即发生被调用,以及



Answer 6:

ShowDialog的具有保持GDI对象活着的副作用。 为了避免GDI泄漏,我们需要适当地处理ShowDialog的。 凡为Show方法没有任何含义和GDI将适当释放。 建议配置ShowDialog的,不依赖于垃圾收集器。



文章来源: Form.ShowDialog() and dispose