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

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

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

28
Refracted Paladin 8 Сен 2010 в 22:29
 – 
StayOnTarget
9 Мар 2018 в 22:20

3 ответа

Лучший ответ

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

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

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

  • Вам необходимо знать точный размер и положение окна. OnLoad лучше всего, создается дескриптор окна, применяются пользовательские настройки (заголовок и размер границы), а форма масштабируется в соответствии с указаниями свойства Form.AutoScaleMode. Окно еще не видно, очень хорошее время, чтобы переместить окно в другое место или расположить дочерние элементы управления.
  • У вас есть код, которому требуется свойство Handle. Это тонко, не всегда можно сказать. Наличие такого кода в конструкторе является нездоровым, окно создается до завершения работы конструктора. Обычно это хорошо заканчивается, но это может очень замедлить создание формы. Легко диагностировать из окна стека вызовов.
  • Чтобы избежать ошибки в реализации MDI. Если вы создаете дочерний элемент MDI в родительском конструкторе, вы получите дублированные глифы, видимые при максимальном увеличении дочернего элемента. Вместо этого создайте дочерний элемент в OnLoad.
28
Hans Passant 9 Сен 2010 в 16:47
Итак, остановите меня, если я ошибаюсь, но более "правильным" будет использовать OnLoad(), но мне нужно будет осознавать тот факт, что код там не будет доступен для другого класса. Верный?
 – 
Refracted Paladin
8 Сен 2010 в 22:44
Он доступен для производного класса base.OnLoad (). Пропуск инициализации базового класса почти всегда был бы неправильным. Другой класс не имеет отношения к коду в Load / OnLoad.
 – 
Hans Passant
8 Сен 2010 в 22:47
Итак, если производный класс вызовет OnLoad(), он запустит base.OnLoad(), а затем любой код, который я добавлю после этого.
 – 
Refracted Paladin
8 Сен 2010 в 22:51
Производный класс никогда не вызывает OnLoad. Всегда base.OnLoad ().
 – 
Hans Passant
8 Сен 2010 в 23:02
1
- хороший ответ не помещается в поле для комментариев. Я рекомендую вам начать свою собственную ветку.
 – 
Hans Passant
9 Сен 2010 в 18:35

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

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

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

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

3
bernhof 30 Июл 2013 в 01:20
Спасибо за ответ, но похоже, что вы говорите, что на мой вопрос нет окончательного ответа, кроме времени загрузки формы, верно?
 – 
Refracted Paladin
8 Сен 2010 в 22:42
1
Я бы лично переопределил метод OnLoad, поскольку это типичный подход при создании унаследованных классов. События, как упоминал Ханс Пассан, предназначены для других классов, которые могут подписаться на них. Но на практике реальной разницы нет.
 – 
bernhof
8 Сен 2010 в 22:46

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

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

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

0
palswim 8 Сен 2010 в 22:52
Я могу быть непослушным, но я думаю, что вы подтверждаете то, что я сказал о OnLoad, вызывающем событие загрузки, но отвечает ли это на мой вопрос о том, в какое из них мне следует разместить свой код? Мне кажется, что я могу вставить любой из них с одинаковым эффектом, если он будет после вызова base.OnLoad(e).
 – 
Refracted Paladin
8 Сен 2010 в 22:40
2
Этот ответ не отвечает на вопрос, который не в том, нужно ли вызывать OnLoad, а в том, нужно ли переопределить его.
 – 
reinierpost
1 Авг 2013 в 12:28