Вам нужна нулевая проверка, так как событие будет нулевым, пока кто-нибудь не подпишется на него. Если вы поднимете его напрямую, и он будет нулевым, будет сгенерировано исключение.
Этот метод используется для повышения события, а не для подписки на него. Вы можете легко подписаться на событие из другого класса:
yourObject.PriceChanged += someMethodWithTheAppropriateSignature;
Однако, когда вы хотите, чтобы событие "огонь", класс должен вызвать событие.
Параметр this предоставляет аргумент sender
в EventHandler<T>
. По соглашению делегаты, используемые для событий, имеют два параметра, первый - object sender
, который должен быть объектом, вызвавшим событие. Вторым является EventArgs
или подкласс EventArgs
, который предоставляет информацию, относящуюся к этому событию. Этот метод используется для правильной проверки на нулевое значение и вызова события с соответствующей информацией.
В этом случае ваше событие объявляется как:
public event EventHandler<PriceChangedEventArgs> PriceChanged;
EventHandler<PriceChangedEventArgs>
- делегат с подписью:
public delegate void EventHandler<T>(object sender, T args) where T : EventArgs
Это означает, что событие должно быть вызвано двумя параметрами - объектом (отправителем или «этим») и экземпляром PriceChangedEventArgs
.
При этом, это соглашение не является на самом деле "лучшим" способом поднять событие. На самом деле было бы лучше использовать:
protected virtual void OnPriceChanged (PriceChangedEventArgs e)
{
var eventHandler = this.PriceChanged;
if (eventHandler != null)
eventHandler(this, e);
}
Это защищает вас в многопоточных сценариях, поскольку вполне возможно, что одна подписка фактически отменит подписку между проверкой на ноль и повышением, если у вас работает несколько потоков.