您的位置:首页 > 编程语言 > C#

C# -- delegate 与 event 解析

2017-03-16 23:41 337 查看
/// <summary>
/// Delegate是类型,Event是成员(本质为成员方法),Event成员类型派生于Delegate
/// </summary>
namespace MyEvent
{
//1.声明委托的类型
public delegate void ChangedEventHandler(object sender,EventArgs e);

//2.列表,当列表数据发生变化的时候会改变 --> Changed --> 通知委托它的事件
public class ListWithChangedEvent : ArrayList
{
//委托的实例 -- event!!!
public event ChangedEventHandler Changed;

public override int Add(object value)
{
int i = base.Add(value);
OnChanged(EventArgs.Empty);//4.只是封装了一下下,本质上就是 --> Changed(this, e);
return i;
}

public override void Clear()
{
base.Clear();
OnChanged(EventArgs.Empty);
}

protected virtual void OnChanged(EventArgs e)
{
if (Changed != null)
Changed(this, e);
}

public override object this[int index]
{
set
{
base[index] = value;
OnChanged(EventArgs.Empty);
}
}
}

//5.监听列表变化,添加委托,一旦发生变化,会调用这里边的回掉方法
class EventListener
{
private ListWithChangedEvent List;

//6.传入要坚挺的列表对象
public EventListener(ListWithChangedEvent list)
{
List = list;
//委托 --> 注册监听 --> 委托直接传入方法,实际上添加的是方法的地址 --> eg:传入的方法不需要括号,明白没?
List.Changed += new ChangedEventHandler(ListChanged);
}

//参数域返回值都必须与委托声明的一致,列表变化回掉的方法
private void ListChanged(object sender, EventArgs e)
{
Console.WriteLine("This list is changed.");
}

public void Dettach()
{
List.Changed -= new ChangedEventHandler(ListChanged);
List = null;
}
}

class Program
{
static void Main(string[] args)
{
//初始化委托
ListWithChangedEvent list = new ListWithChangedEvent();
//添加委托
EventListener listener = new EventListener(list);

list.Add("1");
list.Clear();
listener.Dettach();
list.Add("2");
Console.ReadKey();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: