Подтвердить что ты не робот

Form_Load() 'event' или Override OnLoad()

Я хотел бы, чтобы кто-то попытался объяснить разницу между ними. Более конкретно, пример использования сценария.

Я рефакторинг некоторого кода Windows Form, а Form имеет некоторый код в событии Form_Load(), а также в событии protected override void OnLoad(), которое вызывает base.OnLoad(e);. Теперь я проследил его и Сначала переопределите пожары, а затем немедленно отключите версию события.

Итак, какой из них обычно используется и почему?

4b9b3361

Ответ 1

Вы всегда должны переопределять OnLoad(). Использование события подходит только тогда, когда другой класс будет интересоваться событием. Для чего предназначены события. Еще один класс, интересующийся событием Load, очень редок, только очень полезно делать компоновку окон.

Тем не менее, событие Load хорошо работает с дизайнером, и программисты VB6 очень довольны им. Это не ужасно неправильно, вы столкнулись бы с проблемой, когда начнете наследовать форму, а код не будет работать в правильном порядке.

Большинство кода, которые теперь помещаются в событие Load, действительно принадлежат конструктору. Вам нужно только OnLoad, если:

  • Вам нужно знать точный размер и положение окна. Лучше всего использовать OnLoad, создается дескриптор окна и применяются предпочтения пользователя (размер заголовка и границы), и форма была перемасштабирована по указанию свойства Form.AutoScaleMode. Окно еще не видно, очень хорошее время, чтобы переместить окно в другое место или организовать дочерние элементы управления.
  • У вас есть код, которому требуется свойство Handle. Это тонко, вы не всегда можете сказать. Наличие кода в конструкторе нездорово, окно создается до завершения конструктора. Это, как правило, подходит к концу, но может создать очень медленную форму. Легко диагностировать из окна "Стек вызовов".
  • Чтобы избежать ошибки в реализации MDI. Если вы создаете дочерний MDI в родительском конструкторе, вы получите дублированные глифы, видимые при максимальном увеличении числа дочерних элементов. Вместо этого создайте дочерний элемент в OnLoad.

Ответ 2

При переопределении OnLoad вызов base.OnLoad вызывает Load -event формы.

protected override void OnLoad(EventArgs e)
{
  // do stuff before Load-event is raised
  base.OnLoad(e);
  // do stuff after Load-event was raised
}

Если вам не нужно выполнять какие-либо действия до того, как событие Load-event будет поднято, размещение кода в OnLoad после base.OnLoad(e) дает такое же поведение во время выполнения, как размещение его в обработчике события Form_Load.

Я бы рекомендовал переопределить метод, а не подписываться на событие.

Ответ 3

OnLoad вызывает событие Load, которое обрабатывает Form_Load. См. Статью MSDN.

Итак, в вашем коде, в конце вашей функции инициализации, вы можете вызвать функцию OnLoad. Затем базовый класс вызовет обработчики событий (Form_Load в этом случае), которые вы, возможно, установили в своем коде инициализации.

Лично я поместил свой код в Form_Init и оставил OnLoad для инициирования события, так как я обрабатываю событие, хотя вы можете защищать либо по уважительной причине, как вы видите из своих ответов.