English 中文(简体)
在VB收集的物体的寿命。 净额
原标题:Lifetime of objects in a collection in VB.Net

I m 试图在以下的法典体中标出胎儿的寿命。 让我们假定这个表格有一个空洞的TabaControl,名叫MyTabControl,有一批名为“Collection”的画面。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each itm In NameCollection
        Dim tmpTabPage as New TabPage(itm.toString)

         Add Controls to tmpTabPage

        MyTabControl.TabPages.Add(tmpTabPage)
    Next
End Sub

由于tmpTabPage的作用域是For/Next块,因此它的生存期通常会一直到块结束,对吧?但是,既然它被添加到一个范围在块之外的集合中,它的生存期是否与集合相同,或者在本例中是MyTabControl?最后,如果我调用MyTabControl.TabPages.Clear,集合中的tmpTabPages会被销毁吗?还是它们只是坐着占用内存?

最佳回答

关于从Control派生的类(包括TabPage),最重要的是Dispose()方法。它们不受自动垃圾收集的影响,Winforms保留了一个内部表,该表将控件的Handle映射到控件引用。这就是为什么,比如说,你的主窗体不会突然被垃圾收集,即使你的程序没有保留对它的引用。

将TabPage添加到TabControl的集合会自动处理。这同样适用于TabControl,它将被添加到表单的Controls集合中。正常的事件链是程序或用户关闭窗体。form类迭代其子控件并调用其Dispose()方法。TabControl在其Dispose()方法中做了同样的事情,即处理选项卡页。在这个过程中,Windows窗口被销毁,从映射表中删除Handle,现在允许垃圾收集器最终收集控件的托管包装。

有一个让许多Winforms程序员陷入麻烦的陷阱。如果您从其父控件的集合中删除了一个控件,那么您就有责任自己处理它。删除它并不会自动处理它。Winforms通过将控件临时重新设置为一个名为“停车窗口”的隐藏窗口来保持原生窗口的活力。不错的功能,它允许您将控件从一个父级移动到另一个父项,而无需销毁和重新创建控件。

但这里的关键词是“暂时”。这只是暂时的,如果你下一次修复控件。因此,它从停车窗口移动到新的父对象。如果你没有真正修复它,那么它将永远活在停车窗口上。吞噬资源直到程序终止。这也被称为泄漏。当你已经创建了10000个窗口而Windows拒绝创建另一个窗口时,它可能会使你的程序崩溃。

ControlCollection.Clear()方法在这里尤其有害。它不会处理控件,它们都会移动到停车窗口。如果这不是有意的(很少是这样),您将不得不自己对它们调用Dispose()。

问题回答

当无法获取.NET中的对象时,它们就有资格进行垃圾收集。在这种情况下,将有一种方法通过TabPages集合访问TabPage,直到它从集合中删除或选项卡控件本身有资格进行集合。

现在,当一个对象有资格进行垃圾收集时,这并不意味着它会立即被垃圾收集——垃圾收集会根据一些相当复杂的启发式方法在不同的时间运行,而且还有“几代”内存会使事情更难预测。

但基本上:

  • You don t need to worry that an object that s been added to a collection will be mysteriously collected and cause problems
  • You generally don t need to worry that objects will leak memory forever. There are certainly situations where you do need to take some active steps to make sure that an object is eligible for collection when you re no longer using it, but they re relatively rare. (Typically they are related to static variables and/or events, in my experience.)

因为soemthing引用了不会处理的控件。

是的,如果你不在集合中添加对它们的引用,那么生命周期将一直持续到程序结束。

clear将从集合中删除对象,并且如果没有其他引用,它们将被垃圾收集(在您描述的情况下,这将是不可避免的)

您只将TabPage对象的引用添加到集合中,而不添加对象TmpTabPage。在本例中,tmpTabPage对象仅用于分配内存。





相关问题
Is Shared ReadOnly lazyloaded?

I was wondering when I write Shared ReadOnly Variable As DataType = New DataType() Or alternatively Shared ReadOnly Variable As New DataType() Is it lazy loaded or as the instance initializes? ...

Entertaining a baby with VB.NET

I would like to write a little application in VB.NET that will detect a baby s cry. How would I get started with such an application?

Choose Enter Rather than Pressing Ok button

I have many fields in the page and the last field is a dropdown with list of values. When I select an item in a dropdown and press Enter, it doesn t do the "Ok". Instead I have to manually click on Ok ...

ALT Key Shortcuts Hidden

I am using VS2008 and creating forms. By default, the underscore of the character in a textbox when using an ampersand is not shown when I run the application. ex. "&Goto Here" is not ...

Set Select command in code

On button Click I want to Set the Select command of a Gridview. I do this and then databind the grid but it doesn t work. What am i doing wrong? protected void bttnView_Click(object sender, ...

Hover tooltip on specific words in rich text box?

I m trying to create something like a tooltip suddenly hoovering over the mouse pointer when specific words in the richt text box is hovered over. How can this be done?

热门标签