代碼
// 著作權 (C) Microsoft Corporation。著作權所有,並保留一切權利。
// events1.cs
using System;
namespace MyCollections
{
using System.Collections;
// 用於對更改通知進行掛鈎的委託類型。
public delegate void ChangedEventHandler(object sender, EventArgs e);
// 一個類,其作用與 ArrayList 相似,
// 但在每次列表更改時發送通知。
public class ListWithChangedEvent: ArrayList
{
// 一個事件,每當列表元素更改時,用戶端可利用該事件
// 獲得通知。
public event ChangedEventHandler Changed;
// 調用 Changed 事件;每當列表更改時調用
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null)
Changed(this, e);
}
// 重寫可更改列表的某些方法;
// 在每個重寫後呼叫事件
public override int Add(object value)
{
int i = base.Add(value);
OnChanged(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 EventListener
{
private ListWithChangedEvent List;
public EventListener(ListWithChangedEvent list)
{
List = list;
// 將“ListChanged”添加到“List”中的 Changed 事件。
List.Changed += new ChangedEventHandler(ListChanged);
}
// 每當列表更改時就會進行以下調用。
private void ListChanged(object sender, EventArgs e)
{
Console.WriteLine("This is called when the event fires.");
}
public void Detach()
{
// 分離事件並刪除列表
List.Changed -= new ChangedEventHandler(ListChanged);
List = null;
}
}
class Test
{
// 測試 ListWithChangedEvent 類。
public static void Main()
{
// 建立新列表。
ListWithChangedEvent list = new ListWithChangedEvent();
// 建立一個類,用於偵聽列表的變更事件。
EventListener listener = new EventListener(list);
// 在列表中添加和移除項。
list.Add("item 1");
list.Clear();
listener.Detach();
Console.ReadKey();
}
}
}