An event is a
member that enables a class or object to provide notifications. An event is
declared like a field except that the declaration includes an event keyword and the type must be a delegate type.
Within a class that declares an event
member, the event behaves just like a field of a delegate type (provided the
event is not abstract and does not declare accessors). The field stores a
reference to a delegate that represents the event handlers that have been added
to the event. If no event handles are present, the field is null.
The List<T> class declares a single event member called Changed, which indicates that a new item has been added to the list. The Changed event is raised by the OnChanged
virtual method, which first checks whether the event is null (meaning that no handlers are present). The notion of raising an
event is precisely equivalent to invoking the delegate represented by the
event—thus, there are no special language constructs for raising events.
Clients react to events through event handlers. Event handlers are attached using the += operator and removed using the -= operator.
The following example attaches an event handler to the Changed event of a List<string>.
using System;
class Test
{
static int changeCount;
{
static int changeCount;
static
void ListChanged(object sender, EventArgs e) {
changeCount++;
}
changeCount++;
}
static
void Main () {
List<string> names = new List<string>();
names.Changed += new EventHandler(ListChanged);
names.Add("Liz");
names.Add("Martha");
names.Add("Beth");
Console.WriteLine(changeCount); // Outputs "3"
}
}
List<string> names = new List<string>();
names.Changed += new EventHandler(ListChanged);
names.Add("Liz");
names.Add("Martha");
names.Add("Beth");
Console.WriteLine(changeCount); // Outputs "3"
}
}
For advanced scenarios where control of the
underlying storage of an event is desired, an event declaration can explicitly
provide add and remove accessors, which
are somewhat similar to the set accessor of a
property.
Comments
Post a Comment