Вопрос по .net, winforms, tabcontrol, c# – Удалить TabPage: Удалить или Очистить или оба?

4

Я работаю над формой Windows, которая имеет TabControl с именем tabDocuments. Я наткнулся на этот кусок кода, который удаляет все страницы из TabControl.

for (int i = tabDocuments.TabPages.Count - 1; i > -1; i--) {
    tabDocuments.TabPages[i].Dispose();
}
    tabDocuments.TabPages.Clear();

Человек, который написал этот код, уже ушел. Я пытаюсь понять, почему код вызывает Clear () после удаления каждой из вкладок (кажется мне ненужным). Может кто-нибудь, пожалуйста, объясните мне, почему? Или вызывает Clear () дополнительно?

Ваш Ответ

3   ответа
2

екции TabPages, а просто удаляет их. Вызов Clear () - это то, что удаляет их из коллекции. Если вы неНе вызывайте Clear (), они все равно будут там, и плохие вещи, скорее всего, произойдут, потому что вы в конечном итоге попытаетесь использовать их после их утилизации.

Вы'Ответ имеет смысл. На основании того, что в документации сказано, методы будут делать. Однако, поскольку метод Dispose обладает дополнительными недокументированными функциями (не то, что это неправильно, просто недокументировано), вызов clear не является абсолютно необходимым, но, на мой взгляд, все еще является хорошей практикой. rocka
Даже если это так, вы не должныИспользование в качестве шаблона кода может привести к ошибкам с другими одноразовыми объектами. Max Galkin
@ Марти - ваш ответ неверный. Проверьте с помощью отражателя. Philip Wallace
Тот'удивительно! Я не былне знаю об этом. Marty Dill
3

Этот фрагмент из Control.Dispose:

        if (this.parent != null)
        {
            this.parent.Controls.Remove(this);
        }

Поэтому вам просто нужно вызвать Dispose, а не Clear.

@ Xaero, хотя вы правы в отношении удаления элемента управления из родительского элемента. Вы только случайно узнаете это, разобрав сборку. Нет, где в публичной документации для метода говорится, что он удаляет себя из своего родителя. Эта функциональность может быть изменена в будущей версии фреймворка. Я знаю, что вызывающая сборка может быть нацелена на конкретную версию .NET Framework. Тем не менее, неРекомендуется вызывать метод так, как он предназначен для публичной документации (даже еслине нужно). rocka
Отражатель -red-gate.com/products/reflector Philip Wallace
Спасибо, где вы нашли фрагмент Control.Dispose? David
1

затем Dispose (). Никогда не уничтожайте () что-то, что все еще используется, так как это вызовет исключения и странное поведение.

Также убедитесь, что никто не имеет ссылок на вкладки, иначе эти ссылки станут недействительными в Dispose ().

Isn»Это относится ко всем элементам управления? Вот почему свойство IsDisposed существует ... Philip Wallace
Обычно вы неУтилизировать элементы управления, они существуют во всем приложении, и они нехранить критические неуправляемые ресурсы. Вы можете захотеть избавиться от форм, используемых в качестве одноразовых диалогов. Затем Форма будет распоряжаться своими элементами управления. Max Galkin

Похожие вопросы