C# LanguageСобытия


Вступление

Событие - это уведомление о том, что что-то произошло (например, щелчок мыши) или, в некоторых случаях, произойдет (например, изменение цены).

Классы могут определять события, и их экземпляры (объекты) могут создавать эти события. Например, кнопка может содержать событие Click, которое поднимается, когда пользователь щелкнул его.

Обработчики событий - это методы, которые вызываются при возникновении соответствующего события. Форма может содержать обработчик события Clicked для каждой кнопки, которая содержит, например.

параметры

параметр подробности
EventArgsT Тип, который выводится из EventArgs и содержит параметры события.
Название события Название события.
HandlerName Имя обработчика события.
SenderObject Объект, вызывающий событие.
EventArguments Экземпляр типа EventArgsT, который содержит параметры события.

замечания

При поднятии события:

  • Всегда проверяйте, является ли делегат null . Нулевой делегат означает, что у события нет подписчиков. Поднятие события без подписчиков приведет к NullReferenceException .
6,0
  • Скопируйте делегат (например, EventName ) в локальную переменную (например, eventName ), прежде чем проверять значение null / повышение события. Это позволяет избежать условий гонки в многопоточных средах:

Неправильно :

    if(Changed != null)      // Changed has 1 subscriber at this point
                             // In another thread, that one subscriber decided to unsubscribe
        Changed(this, args); // `Changed` is now null, `NullReferenceException` is thrown.

Справа :

    // Cache the "Changed" event as a local. If it is not null, then use
    // the LOCAL variable (handler) to raise the event, NOT the event itself.
    var handler = Changed;
    if(handler != null)
        handler(this, args);
6,0
  • Используйте оператор с нулевым условием (?.) Для повышения метода вместо нулевой проверки делегата для подписчиков в выражении if : EventName?.Invoke(SenderObject, new EventArgsT());
  • При использовании Action <> для объявления типов делегатов подпись анонимного метода / события должна быть такой же, как объявленный анонимный тип делегата в объявлении события.

События Связанные примеры