Вопрос

Я пытаюсь выяснить время жизни tmptabpages в следующем бит кода. Предположим, что в форме есть пустой TabControl под названием MyTabControl, что есть коллекция строк, называемых NameCollection.

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 является для/следующим блоком, обычно это будет срок службы до конца блока, верно? Но так как он добавлен в коллекцию, в которой есть прицел за пределами блока, получает ли он та же срок службы, что и коллекция, или в этом случае MyTabControl? Наконец, если я позвоню в mytabcontrol.tabpages.clear, будут ли уничтожить tmptabpages в коллекции или они просто будут сидеть вокруг, занимая память?

Это было полезно?

Решение

Большое дело о классах, полученных из управления (включая TabPage), - это метод Dispose (). Они невосприимчивы к автоматической сборе мусора, Winforms сохраняет внутреннюю таблицу, которая отображает рукоятку управления с контролем. Вот почему, скажем, ваша основная форма не вдруг собирает мусор, даже если ваша программа не содержит на нее ссылки.

Добавление таблицы в коллекцию TabControl заботится об автоматическом утилизации. То же самое относится и к TabControl, он будет добавлен в коллекцию элементов управления формой. Нормальная цепочка событий заключается в том, что ваша программа или пользователь закрывает форму. Класс формы отражает его дочерние элементы управления и вызывает их метод Dispose (). TabControl делает то же самое в своем методе Dispose (), утилизируя страницы вкладок. Окно Windows разрушается в процессе, удаляя ручку из этой стола отображения и теперь позволяет сборщику мусора, в конечном итоге собирать управляемую обертку для элементов управления.

Существует неприятная ловушка, которая доставляет много программистов Winforms в беде. Если вы удалите контроль из коллекции его родителей, то вы получите ответственность за утилизацию его самостоятельно. Удаление этого делает нет автоматически утилизируйте это. Winforms сохраняет нативное окно, временно перепродав управление в скрытое окно под названием «Окно парковки». Хорошая функция, она позволяет вам перемещать управление от одного родителя на другого, не уничтожая и воссоздать управление.

Но ключевое слово там «временно». Это только временно, если вы в следующий раз предварительно предотвращаете контроль. Таким образом, он перемещается из окна парковки к новому родителю. Если вы на самом деле не предпринимаете его, то он останется в живых на вечно в окне парковки. Поглощение ресурсов, пока программа не завершится. В остальном это известно как утечка. Он может сбить вашу программу, когда Windows отказывается создавать другое окно, когда вы уже создали 10 000 из них.

Метод ControlCollection.Clear () здесь особенно вреден. Оно делает нет Утилизируйте элементы управления, все они перемещаются в это окно парковки. Если это не предназначено, то это редко, вам придется называть на них () на них.

Другие советы

Объекты в .NET становятся правомочными для сбора мусора, когда нет возможности получить их. В этом случае там будут быть способом добраться до TabPage через TabPages Сбор, пока он не будет удален из коллекции, либо самого элемента управления вкладкой не станет право на сбор.

Теперь, когда объект становится подходящим для сбора мусора, это не означает, что он сразу же собирается мусор - сбор мусора работает в разное время в соответствии с некоторой довольно сложной эвристикой, а также «поколения», которые затрудняют предсказание. Анкет

Но в основном:

  • Вам не нужно беспокоиться о том, что объект, который был добавлен в коллекцию, будет загадочно собран и вызывает проблемы
  • Как правило, вам не нужно беспокоиться о том, что объекты будут утекать память навсегда. Конечно, есть ситуации, когда вы делать Нужно предпринять несколько активных шагов, чтобы убедиться, что объект имеет право на сбор, когда вы больше не используете его, но они относительно редкий. (Как правило, они связаны со статическими переменными и/или событиями, по моему опыту).

Потому что у Soemthing есть ссылка на элементы управления, из которых они не будут утилизироваться.

Да, срок службы будет до конца процедуры, если вы не добавили ссылку на них в Colelction.

Чистое удалит объекты из коллекции, и они будут собраны мусор, если на них нет других ссылок (которые там находятся в ситуации, которую вы описываете)

Вы добавляете только ссылку объекта TabPage в коллекцию, а не объект tmptabpage. Объект tmptabpage В этом случае вы используете его только для распределения памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top