Можно ли повторно использовать объект формы .NET WinForms? - PullRequest
4 голосов
/ 13 января 2009

Как только окно закрыто, можно и рекомендуется повторно использовать экземпляр формы этого окна, чтобы снова показать это же окно? Или требуется или рекомендуется всегда создавать новый экземпляр класса, когда вы будете показывать окно.

Что в действительности сводится к тому, является ли хорошей идеей когда-либо вызывать Show () или ShowDialog () более одного раза для одного и того же объекта, если окно между ними закрыто.

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

Ответы [ 3 ]

8 голосов
/ 13 января 2009

Нет и нет.

Вызов Close завершается вызовом Dispose, и объект считается удаленным.

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

2 голосов
/ 13 января 2009

По моему мнению, эта идея нарушает три принципа: (1) избегать преждевременной оптимизации, (2) принцип наименьшего удивления и (3) слишком тесная связь данных с пользовательским интерфейсом.

Кажется, вы оптимизируете время, но сколько времени? Если отображение рассматриваемой формы требует очень много времени или ресурсов, тогда да, вероятно, неплохо делать то, что вы предлагаете. Но, вообще говоря, шаблон создания окна и его разрушения, когда пользовательский интерфейс больше не требует его отображения, является проверенной временем практикой. Кроме того, когда окно не видно, оно все еще занимает память. И если это окно опирается на такие вещи, как дескрипторы файлов или соединения с базой данных, это потенциальный источник ошибок.

Принцип наименьшего удивления означает, что нужно действовать ожидаемым способами для всех пользователей системы, включая конечных пользователей, сопровождающих и разработчиков. Шаблон, который вы описываете, необычен и поэтому может вызвать больше проблем, чем стоит.

Другая причина, по которой следует избегать этой практики, состоит в том, что она нарушает дух широко используемого шаблона проектирования Model-View-Controller, который отделяет сам объект от задачи отображения или изменения объекта. Есть очень веские причины для использования этого шаблона проектирования, и даже если вы этого не сделаете, философия, лежащая в его основе, является хорошей. Существование объекта обычно не зависит от какого-либо объекта пользовательского интерфейса и, следовательно, должно существовать отдельно от пользовательского интерфейса. Например, объект Customer существует независимо от того, отображается ли окно, относящееся к этому Customer. Слишком плотное связывание данных с объектами пользовательского интерфейса часто приводит к хрупкому, трудно меняемому коду.

Если вы решите реализовать это, я бы посоветовал не создавать слишком много таких скрываемых окон и попытаться свести их к минимуму, и в этом случае код Майкла Буэна кажется элегантным решением проблемы.

1 голос
/ 14 января 2009

Когда вы имеете дело с окнами форм, ВСЕГДА создавайте новые экземпляры. Чрезвычайно легко упаковать много скрытых состояний в форму и создать неожиданный пользовательский опыт внезапно при 2-м, 3-м или N-м вызове. По моему опыту, этот эффект резко возрастает, когда к форме добавляется больше элементов управления и кода представления.

Объедините повторное использование экземпляра формы с чем-либо, кроме разделения нацистского уровня MVC, и вы просите о важном моменте WTF, обычно во время функционального тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...