Где лучше всего выполнить инициализацию в winform? - PullRequest
7 голосов
/ 15 января 2010

В событии Load или в конструкторе после InitializeComponent ()?

или не имеет значения вообще?

Ответы [ 6 ]

5 голосов
/ 15 января 2010

Событие Form.Shown - хорошее место для любой инициализации, которая может занять более одной секунды. Form.Shown происходит только один раз, всего через после форма впервые становится видимой для пользователя.

Очевидно, что если у вас длительная инициализация, вам все равно нужно предоставить какую-то визуальную обратную связь и, возможно, отключить разделы формы до завершения. Но если инициализация неизбежна, Form.Shown, по крайней мере, позволяет вам сообщить пользователю, что приложение не зависло, и дать отзыв о том, что оно на самом деле делает.

По сравнению с Form.Load: с точки зрения пользователей ваше приложение будет запускаться быстрее, поскольку ваша форма уже видна во время инициализации.

По сравнению с Form.Activation: вам не нужно беспокоиться о том, что инициализация выполняется несколько раз, поскольку событие Activated вызывается каждый раз, когда ваша форма скрыта / показана, свернута / развернута и т. Д.

По сравнению с конструктором: похоже на Form.Load, ваша форма не будет видна до завершения инициализации. Кроме того, вы должны быть более внимательны к вопросам синхронизации / последовательности, связанным с элементами управления, которые могут быть не полностью инициализированы.

4 голосов
/ 15 января 2010

Для более тяжелой инициализации это обычно делается в событии load. Конструкторы обычно используются для быстрой и простой инициализации полей. Если вам, например, нужно вызвать метод для внешней зависимости, вы должны сделать это из load.

3 голосов
/ 15 января 2010

Более тяжелая инициализация также не может быть хорошей идеей в событии загрузки, поскольку это может увеличить время загрузки и может раздражать конечного пользователя. Я предпочитаю выполнять базовую инициализацию (скажем, которая занимает <10 секунд) в форме загрузки и выполняю остальную часть тяжелой работы после ее отображения пользователю. Чтобы заставить пользователя ждать, может отображаться индикатор прогресса. </p>

2 голосов
/ 15 января 2010

Зависит от вида инициализации. Например, простая инициализация поля может быть выполнена в конструкторе, и это избавляет вас от необходимости подключать событие, иметь дополнительный метод и т. Д.

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

1 голос
/ 15 января 2010

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

0 голосов
/ 16 января 2010

Подумайте, что произойдет, если вы дважды введете Show или ShowDialog для одной и той же формы. Все, что не может измениться между этими двумя вызовами, должно быть в конструкторе; весь код инициализации в зависимости от соответствующего Show (Dialog) вызова должен быть в обработчике событий, который будет вызываться для каждого из этих вызовов. Например, владелец формы передается в ShowDialog, а не в конструкторе, и может отличаться для 2 разных вызовов ShowDialog, поэтому все, что зависит от владельца, не должно быть в конструкторе. *

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