Удалить TabPage: Dispose или Clear или оба?

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

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

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

3 ответа

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

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

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


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


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

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

licensed under cc by-sa 3.0 with attribution.