Что это за строка кода? - PullRequest
0 голосов
/ 03 апреля 2011

Часто в коде я вижу строку кода, у меня есть идея, что она что-то делает с событием, но не совсем точно знаю, что он делает.

Возможно ли, что я могу прикрепить событие загрузки формы A в форме Bс этим, или в чем его выгода?

this.CGForm .Load +=new EventHandler(CGForm_Load);

Ответы [ 4 ]

3 голосов
/ 03 апреля 2011

Да, это явно связано с событиями.

.Load в этом случае событие Form.Load.Оператор += добавляет один обработчик события к событию.Событие может иметь много обработчиков событий одновременно.Обработчики событий - это обычный метод, который может быть где угодно в вашей кодовой базе.Когда запускается событие, будут вызываться все подписанные методы, один за другим.

Я не вижу особой веской причины, чтобы FormA слушала событие Load FormB, но другие события могут быть более интересными, напримерсобытие Form.Closed.Это способ заставить FormA реагировать на изменения в FormB.

Edit
Обратите внимание, что это заставляет FormA содержать ссылку на FormB, и FormB не будет собирать мусор, пока FormAосвобождает ссылку на FormB (с
this.CGForm .Load -=new EventHandler(CGForm_Load);, обратите внимание на -=), это частая причина утечек памяти в .NET.

Подписка на события из других форм - это «запах кода»это может быть потенциальной структурной проблемой в вашем коде.В некоторых случаях это требуется, но если он у вас есть повсюду, ваш код будет трудно понять и поддерживать.

3 голосов
/ 03 апреля 2011

Он просто добавляет метод GCForm_Load к событию Load в CGForm. Под капотом при загрузке CGForm будет выполняться код, подобный следующему. Всякий раз, когда это происходит, будут вызываться все подписчики событий (в этом случае метод, подписанный здесь как CGForm_Load).

<pseudocode>
class CGForm
{
  public EventHandler<FormLoadedEventArgs> Load;

  private void SomeMethodThatLoadsTheForm()
  {
    LoadForm();
    var loadHandlers = Load;
    if (loadHandlers != null)
    {
       loadHandlers(new FormLoadedEventArgs(...));
    }
  }
}
</pseudocode>
3 голосов
/ 03 апреля 2011

Эта строка означает, что вы подписываете метод CGForm_Load() на событие this.CGForm.Load. Метод CGForm_Load() является обработчиком событий или обратным вызовом .

После запуска этой строки каждый раз, когда возникает событие (в данном случае - каждый раз при загрузке формы), автоматически вызывается CGForm_Load().

Чтобы отказаться от подписки на обратный вызов, используйте -=, например:

this.CGForm.Load -= new EventHandler(CGForm_Load)

Как только обратный вызов события отменяется, при следующем вызове события (если форма загружается снова) обратный вызов больше не будет вызываться.


Мне кажется полезной следующая метафора: событие похоже на розетку, а обратные вызовы - на розетки. Подписка - это как подключение вилки к розетке, а отмена - это как вытащение. При наличии соединения все вызовы события вызывают обратный вызов.

2 голосов
/ 03 апреля 2011

this.CGForm .Load +=new EventHandler(CGForm_Load); подписывает делегат обработчика событий CGForm_Load на событие Load объекта CGForm.

Документацию о подписке на события можно найти по адресу http://msdn.microsoft.com/en-us/library/ms366768(v=vs.80).aspx.

И индекс информации о том, как события работают в .NET, можно найти по адресу http://msdn.microsoft.com/en-US/library/awbftdfh(v=VS.80).aspx

...