Now that you understand delegates, let’s look at how to take advantage of them to create events. Events are just syntactic sugar for properties on classes that are delegates. So when an event is raised, it is really just invoking the combined delegates associated with the event.
Let’s start with a simple example and work backward from
that. Unlike C# or VB.NET, there is no
event keyword in F#.
Example 8-11 creates
NoisySet type that fires events
whenever items are added and removed from the set. Rather than keeping
track of event subscribers manually, it uses the
Arg> type, which will be discussed
Example 8-11. Events and the Event<_,_> type
type SetAction = Added | Removed type SetOperationEventArgs<'a>(value : 'a, action : SetAction) = inherit System.EventArgs() member this.Action = action member this.Value = value
type SetOperationDelegate<'a> = delegate of obj * SetOperationEventArgs<'a> -> unit// Contains a set of items that fires events whenever // items are added. type NoisySet<'a when 'a : comparison>() = let mutable m_set = Set.empty : Set<'a> let m_itemAdded =
new Event<SetOperationDelegate<'a>, SetOperationEventArgs<'a>>()let m_itemRemoved = new Event<SetOperationDelegate<'a>, SetOperationEventArgs<'a>>() member this.Add(x) = m_set <- m_set.Add(x) // Fire the 'Add' event
m_itemAdded.Trigger(this, new SetOperationEventArgs<_>(x, Added))member this.Remove(x) = m_set <- m_set.Remove(x) // Fire the 'Remove' event