【问题标题】:Remove(), Clear() or Dispose()Remove()、Clear() 或 Dispose()
【发布时间】:2011-01-13 21:29:21
【问题描述】:

简单的问题...

我有一些控件,用户可以在运行时在我的表单上拖动。他们也可以删除它们......当他们点击删除按钮时我应该只打电话给.Dispose();,还是应该做类似panel1.Controls.Clear(Control);的事情? ...还是别的什么?

谢谢:)

贝尔

【问题讨论】:

    标签: .net winforms


    【解决方案1】:

    您应该按照 Darin Dimitrov 的回复中所述将其从父 Controls 集合中删除,并调用 Dispose:

    panel.Controls.Remove(someControlInstance);
    someControlInstance.Dispose();
    

    当您完成对实现 IDisposable 的对象时,您应该始终调用 Dispose,以便立即释放它们拥有的任何非托管资源。

    【讨论】:

    • 正是我希望听到的。非常感谢乔。
    【解决方案2】:

    只需从面板中移除控件即可:

    panel.Controls.Remove(someControlInstance);
    

    一旦不再有对它的引用,它将受到垃圾回收,并且非托管资源将被正确处置。

    【讨论】:

    • "Subject to Garbage Coll.."... 那么,一旦应用程序退出,它就会被处理掉?如果我能在从面板控制中删除它后立即以某种方式处理它,它会有什么不同(性能方面)吗? p.s.谢谢你的回答:)
    • 它不会在应用程序退出时被释放,而是在垃圾收集器运行时被释放,这是不确定的。
    • 它将在 GC 决定时被释放,这可能发生在应用程序运行的中间和最后。此处的区别在于,如果您显式调用 Dispose(),则将执行对象终结,并且在下一次运行时,GC 将清理对象的内存,否则在第一次运行时,GC 会将对象放入终结队列并在另一次运行时清理其内存。更多关于这里的主题:msdn.microsoft.com/en-us/library/ms973837.aspx
    • 谢谢 Darin Dimitrov 和 dh... 现在将查看该链接 :)
    • 我认为这会导致内存泄漏,请参阅Hans Passant's answer here: ...the Control class does not behave like any other .NET class. A Control is kept alive by its Handle property. Which stores the native Windows handle. As long as the native window exists, the Control object cannot be destroyed. GC 似乎无法自行处理Control
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 2013-08-31
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多