Я хотел бы, чтобы кто-нибудь попытался объяснить разницу между ними. В частности, пример сценария использования.
Я выполняю рефакторинг некоторого кода Windows Form , и Form
содержит код в событии Form_Load()
, а также в событии protected override void OnLoad()
, которое вызывает base.OnLoad(e);
Now Я отследил это, и сначала срабатывает Override, а затем сразу запускается версия события.
Итак, какой из них обычно используется и почему?
3 ответа
Вы всегда должны переопределять OnLoad (). Использование события уместно только тогда, когда другой класс будет заинтересован в событии. Для чего и нужны мероприятия. Другой класс, заинтересованный в событии Load, встречается очень редко, он действительно полезен только для компоновки окон.
Тем не менее, событие Load хорошо работает с дизайнером, и программисты VB6 очень хорошо с ним справляются. Это не так уж и плохо, у вас могут возникнуть проблемы только тогда, когда вы начнете наследовать форму, а код работает не в правильном порядке.
Большая часть кода, который теперь помещается в событие Load, действительно принадлежит конструктору. OnLoad нужен только в следующих случаях:
- Вам необходимо знать точный размер и положение окна. OnLoad лучше всего, создается дескриптор окна, применяются пользовательские настройки (заголовок и размер границы), а форма масштабируется в соответствии с указаниями свойства Form.AutoScaleMode. Окно еще не видно, очень хорошее время, чтобы переместить окно в другое место или расположить дочерние элементы управления.
- У вас есть код, которому требуется свойство Handle. Это тонко, не всегда можно сказать. Наличие такого кода в конструкторе является нездоровым, окно создается до завершения работы конструктора. Обычно это хорошо заканчивается, но это может очень замедлить создание формы. Легко диагностировать из окна стека вызовов.
- Чтобы избежать ошибки в реализации MDI. Если вы создаете дочерний элемент MDI в родительском конструкторе, вы получите дублированные глифы, видимые при максимальном увеличении дочернего элемента. Вместо этого создайте дочерний элемент в OnLoad.
OnLoad()
, но мне нужно будет осознавать тот факт, что код там не будет доступен для другого класса. Верный?
OnLoad()
, он запустит base.OnLoad()
, а затем любой код, который я добавлю после этого.
При переопределении 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
.
Я бы рекомендовал переопределить метод, а не подписываться на событие.
OnLoad
вызывает событие Load , которое обрабатывает Form_Load
. См. статью MSDN.
Итак, в вашем коде в конце вашей функции инициализации вы можете вызвать функцию OnLoad
. Затем базовый класс вызовет ваши обработчики событий (в данном случае Form_Load
), которые вы, возможно, установили в коде инициализации.
Лично я бы поместил свой код в Form_Init
и оставил бы OnLoad
для инициирования события, поскольку я обрабатываю событие, хотя вы можете защищать любой из них по уважительной причине, как вы видите из ваших ответов.
base.OnLoad(e)
.
OnLoad
, а в том, нужно ли переопределить его.
Похожие вопросы
Связанные вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.