В событии Load или в конструкторе после InitializeComponent ()?
или вообще не имеет значения?
В событии Load или в конструкторе после InitializeComponent ()?
или вообще не имеет значения?
Событие Form.Shown - это хорошее место для выполнения любой инициализации, которая может занять более одной секунды. Form.Shown появляется только один раз, сразу после форма сначала становится видимой для пользователя.
Очевидно, что если у вас длительная инициализация, вам все равно нужно предоставить какую-то визуальную обратную связь и, возможно, отключить разделы формы до завершения. Но если инициализация неизбежна, Form.Shown, по крайней мере, позволяет вам сообщить пользователю, что приложение не зависло, и дать обратную связь о том, что оно на самом деле делает.
По сравнению с Form.Load: с точки зрения пользователей ваше приложение будет восприниматься как запускаемое быстрее, потому что ваша форма уже видна, пока выполняется инициализация.
По сравнению с Form.Activated: вам не нужно беспокоиться о том, что инициализация будет выполняться несколько раз, потому что событие Activated вызывается каждый раз, когда ваша форма скрывается / отображается, минимизируется / развертывается и т. Д.
По сравнению с конструктором: аналогично Form.Load ваша форма не будет видна до завершения инициализации. Кроме того, вы должны быть более осторожны с проблемами времени / последовательности, связанными с элементами управления, которые могут быть не полностью инициализированы.
Для более тяжелой инициализации это обычно выполняется в событии загрузки. Конструкторы обычно используются для быстрой и простой инициализации полей. Например, если вам нужно вызвать метод внешней зависимости, вы должны сделать это из загрузки.
Более тяжелая инициализация также может быть не очень хорошей идеей при загрузке, поскольку она может увеличить время загрузки и может раздражать конечного пользователя. Я предпочитаю выполнять базовую инициализацию (скажем… которая занимает ‹10 секунд) в Form Load и выполнять остальную тяжелую работу после того, как она отображается пользователю. Чтобы заставить пользователя ждать, может отображаться индикатор выполнения.
Это зависит от типа инициализации. Например, простая инициализация поля может быть выполнена в конструкторе, и это избавит вас от необходимости подключать событие, иметь дополнительный метод и т. Д.
Однако в некоторых случаях у конструктора нет нужной информации. Например, если вы хотите делать разные вещи в зависимости от того, находитесь ли вы в режиме разработки или в режиме выполнения (например, в режиме выполнения вы подключаетесь к источнику данных, но в режиме разработки вы хотите отображать образцы данных), тогда это должно должен быть отложен до завершения построения, потому что структура не устанавливает режим DesignMode до тех пор, пока объект не будет построен.
Выполнение чего-либо в событии Load сделает исключения, когда он не работает, немного легче читается, а IMHO семантически чище. Практически это не имеет большого значения.
Подумайте, что произойдет, если вы дважды запустите Show
или ShowDialog
для одной и той же формы. Все, что не может измениться между этими двумя вызовами, должно быть в конструкторе; весь код инициализации, зависящий от соответствующего вызова Show (Dialog), должен находиться в обработчике событий, который будет вызываться для каждого из этих вызовов. Например, владелец формы передается в ShowDialog
, а не в конструкторе, и может быть различным для двух разных вызовов ShowDialog
, поэтому все, что зависит от владельца, не должно быть в конструкторе.