Я в настоящее время перехожу от VB до C# и имею некоторые проблемы относительно регистрации моего интереса к событию.
При использовании VB это был просто случай определения что метод Handles
и событие, часто это было сгенерировано при помощи объектного списка событий. В то время как я могу легко использовать Class.event += delegate
в C# я не уверен, куда лучшее место должно поместить код, чтобы сделать это.
Я лучше всего помещаю его в InitializeComponent()
согласно сгенерированному коду (говорят, выбираете ли Вы событие в от разработчика), или если я помещаю его в конструкторе для лучшей удобочитаемости/обслуживания. Если в конструкторе, должен он быть прежде или после вызова к InitializeComponent()
?
Когда вы занимаетесь разработкой WinForm (судя по упомянутой функции InitializeComponent ()), обычно вы назначаете обработчик с помощью Visual Studio. Вы просматриваете свойства своего элемента управления, щелкаете значок молнии, чтобы получить список всех событий, находите свое событие и либо дважды щелкаете по нему (для создания нового обработчика), либо выбираете существующий обработчик из списка. Visual Studio добавит проводку этого в сгенерированный код, поэтому вам не нужно об этом беспокоиться.
2 способа сделать это. Вы можете либо создать свой собственный метод, который вы вызываете в своем конструкторе, который, в свою очередь, создает обработчик событий, либо вы можете просто поместить их в свой конструктор. Вероятно, хорошая идея - удалить обработчики событий из кода финализатора / деструктора.
Если у вас есть метод InitializeComponent ()
, вы используете конструктор, поэтому вы можете связывать события прямо в конструкторе, если хотите . Для этого щелкните значок молнии в окне свойств, и вы увидите список всех событий для выбранного объекта. Вы можете просто ввести там название события, и он создаст для вас код.
Если вы не являетесь поклонником дизайнера, свяжите их после вызова InitializeComponent
и убедитесь, что вы отсоединили их, когда закончите (в Dispose ()
).
Я всегда создаю частный метод под названием Init()
и помещаю его туда, а затем вызываю этот метод из конструктора или обработчика события Form_Load. Это семантически лучше, IMO, чем делать это в самом конструкторе. И вы не хотите размещать его внутри InitializeComponent()
, потому что в следующий раз, когда вы измените что-то в конструкторе, он, скорее всего, удалит весь добавленный вручную код.
Не не вручную добавляйте код в метод InitializeComponent ()
. Этот метод генерируется кодом, поэтому, как только вы измените форму, любая логика, которую вы добавили вручную в этот метод, будет уничтожена.
Я обычно добавляю метод для обработки события формы Load
и помещаю туда свои регистрации событий.
Я бы поместил его после InitializeComponent, поскольку вы можете регистрировать события для дочернего элемента управления / объекта, например кнопки, и вы хотите быть уверены, что объект уже создан.
Бывают случаи, когда вы подключаетесь к событиям динамически / условно в других местах, например, в ответ на какое-то другое событие.
Иногда дизайнер Visual Studio может испортить код, поэтому добавление обработчиков событий в InitializeComponent
может создать головную боль, лучше сделать это примерно так
public Form1(){ InitializeComponent(); WireUpEvents(); } public void WireUpEvents(){ this.fooEvent += new EventHandler(foo_handler); .... etc .... }
И убедитесь, что вы удалили обработчики событий в функции Dispose формы....
public void UnWireEvents(){ this.fooEvent -= new EventHandler(foo_handler); .... etc .... }
По мере разработки формы Visual Studio будет изменять код в методе InitializeComponent()
, расположенном в form.design.cs
, поэтому крайне важно, чтобы вы не редактировали этот код вручную...
Это зависит, но большая часть время, да.
Используйте InitializeComponent, если вы хотите, чтобы событие было перехвачено на протяжении всей формы (я предполагаю, что вы говорите о Forms / UserControls / и т. Д.). В других случаях вам понадобится более детальный контроль над обработкой события.
Имейте в виду, что вы захотите отцепить все эти события (используя синтаксис - =), когда вы удаляете форму или больше не хотите обрабатывать событие. Сохранение прикрепленных делегатов обработчика событий - одна из наиболее распространенных утечек управляемой памяти.