VB.NET: События возникают, даже если нет обработчиков событий? - PullRequest
8 голосов
/ 30 октября 2008

У меня есть класс, который загружает, проверяет и сохраняет несколько больших файлов XML. Иногда я хочу, чтобы пользовательский интерфейс сообщал мне, что происходит, но иногда я буду использовать класс и игнорировать события. Таким образом, я поместил строки кода в дюжине мест:

RaiseEvent Report("Sending request: " & queryString)

RaiseEvent Report("Saving file: " & fileName)

RaiseEvent Report("Finished")

Мой вопрос таков: замедлят ли эти события мой код, если их ничего не слушает? Будут ли они даже стрелять?

Ответы [ 4 ]

7 голосов
/ 30 октября 2008

Мой собственный ответ:

В VB.NET событие НЕ запускается, если не настроены обработчики для его прослушивания.

Я провел небольшой эксперимент, в котором код, который вызывает событие, передает результат функции, и эта функция выполнялась только тогда, когда был установлен обработчик события для обработки события.

RaiseEvent Report(GetMyString())

Другими словами, я говорю, что вышеприведенная функция GetMystring не вызывается, если обработчики на самом деле не существуют.

6 голосов
/ 30 октября 2008

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

Если ваш REAL вопрос: «Чтобы сэкономить время, я должен проверить, что события имеют обработчики, прежде чем вызывать события?» , , , тогда ответ «Нет», вы ничего не получите от этого.

Кроме того, не беспокойтесь об оптимизации, если вам не нужно (см. Эту запись в Википедии , чтобы узнать почему.)

Re: Звонок GetMystring().

Да, это связано с тем, как вы вызываете события в C #, где вы проверяете наличие обработчиков перед тем, как вызывать событие. E.g.:

if (MyEvent != null)
    MyEvent(GetMyString())

Кстати, хороший эксперимент:)

1 голос
/ 30 октября 2008

Может быть небольшое количество накладных расходов, но я бы не беспокоился об этом. Конечно, фактическим действием будет драйвер производительности.

В качестве примечания: создание события без обработчиков в C # фактически вызывает исключение. VB.Net не имеет этой проблемы:)

0 голосов
/ 16 октября 2012

Если ваш РЕАЛЬНЫЙ вопрос «Чтобы сэкономить время, я должен проверить, что события есть обработчики, прежде чем вызывать события? "... тогда ответ «Нет», вы ничего не получите от этого.

В C #, если вы не проверяете событие на null и нет зарегистрированных обработчиков, вы получите исключение NullReferenceException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...