namespace MyCollections
{
using System.Collections;
public delegate void ChangedEventHandler(object sender, EventArgs e);
public class ListWithChangedEvent : ArrayList
{
/* 声明一个事件,名称为Changed,并指明用ChangedEventHandler作为委托
当触发Changed事件时,可以通过ChangedEventHandler这个委托进行事件处理*/
public event ChangedEventHandler Changed;
public event ChangedEventHandler Added;
protected virtual void OnChanged(EventArgs e)
{
/* 事件调用: (调用事件的语法和调用方法类似,直接使用事件的名称,并传入事件的参数就可以了)
*
* 先判断是否有对象将委托与该事件关联,
* 如果没有对象将委托与事件关联,则委托的事件为null。
* 调用事件时先检查是否为null,如果不为null,再调用该事件。
* ※其实也可以理解为事件Changed当使用+=之后,Changed被赋值了(即被关联了委托ChangedEventHandler)
* ※同时由于委托指向了方法,因此当事件Changed发生时,被指向的方法也就可以被调用了。
*/
if (Changed != null)
Changed(this, e);
}
protected virtual void OnAdded(EventArgs e)
{
if (Added != null)
Added(this, EventArgs.Empty);
}
/* 当调用Add,Clear或者set数组的时候,就会调用OnChanged方法,而OnChanged方法中调用了Changed事件,
* 所以也可以说当调用如下的方法时调用了Change事件 */
public override int Add(object value)
{
int i= base.Add(value);
OnAdded(EventArgs.Empty);
return i;
}
public override void Clear()
{
base.Clear();
OnChanged(EventArgs.Empty);
}
public override object this[int index]
{
set
{
base[index] = value;
OnChanged(EventArgs.Empty);
}
}
}
}
namespace TestEvents
{
using MyCollections;
class Test
{
public static void Main()
{
ListWithChangedEvent list = new ListWithChangedEvent();
list.Added += new ChangedEventHandler(ListAdded);
/*
* 用+=将事件和委托关联在一起,使用-=解除关联。一旦建立起这种关联,委托就可以调用事件发生时处理的方法。
* 事件Changed和委托ChangedEventHandler关联在一起,并指明当事件发生时,调用参数中指明的方法ListChanged。
* 这样,ChangedEventHandler就知道,当对象的状态改变时,就调用Changed事件,调用Changed事件时就执行ListChanged这个方法。
*/
list.Changed += new ChangedEventHandler(ListChanged);
//以上的一步可以分解成如下二步:
//ChangedEventHandler a = new ChangedEventHandler(ListChanged);
//List.Changed += a;
list.Add("item 1");
list[0] = "item 2";
list.Clear();
list.Added -= new ChangedEventHandler(ListAdded);
list.Changed -= new ChangedEventHandler(ListChanged);
}
private static void ListChanged(object sender, EventArgs e)
{
/* 事件处理方法的参数类型和个数必须和delegate类型定义的一致,不过参数的名称可以相同也可以不同 */
Console.WriteLine("Changed or Cleared");
}
private static void ListAdded(object sender, EventArgs e)
{
Console.WriteLine("Added");
}
}
}