Events
When using delegates, two emergent roles commonly appear: broadcaster and subscriber.
The broadcaster is a type that contains a delegate field. It decides when to broadcast by invoking the delegate.
The subscribers are the method target recipients. A subscriber
decides when to start and stop listening by calling +=
and -=
on the broadcaster’s delegate. A subscriber does
not know about, or interfere with, other subscribers.
Events are a language feature that formalizes this pattern. An event
is a wrapper for a delegate that exposes just the subset of delegate
features required for the broadcaster/subscriber model. The main purpose of events is to
prevent subscribers from interfering with one another.
To declare an event member, you put the event
keyword
in front of a delegate member. For instance:
public class Broadcaster
{
public event
ProgressReporter Progress;
}
Code within the Broadcaster
type has full access to
Progress
and can treat it as a delegate. Code outside
of Broadcaster
can only perform +=
and -=
operations on Progress
.
Consider the following example. The Stock
class
invokes its PriceChanged
event every time the Price
of the Stock
changes:
public delegate void PriceChangedHandler
(decimal oldPrice, decimal newPrice);
public class Stock
{
string symbol;
decimal price;
public Stock (string symbol) {this.symbol = symbol;}
public event PriceChangedHandler PriceChanged;
public decimal Price { get { return price; } set { if (price == value) return; if (PriceChanged != null) ...
Get C# 3.0 Pocket Reference, 2nd Edition now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.