C#的事件与托管(代码理解)

using System;

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);

}


/* 当调用AddClear或者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");

}


}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值