您的位置:首页 > 其它

委托和事件的区别

2010-03-30 22:16 423 查看
在.NET中,委托和事件是直接相关的.如果你有C++的基础,就不难理解委托的作用,委托要达到的目的基本上同C++中的函数指针是一样的,只是委托是类型安全,具有保护机制的---不会指向一个无效的地址.委托主要有两个应用:回调和事件处理.

事件是通过委托来定义的,定义事件之前要有相应的委托,处理事件的委托有严格规定:1, 必须有两个参数,2.第一个参数是一对象,表示是谁引发的事件,第二个参数是从EventArgs派生的类,它包括了处理事件时所需要的信息.

比如定义一个Click事件:

public delegate void EventHandler (obj o, EevntArsg);

public event EventHandler SimpleEvent;

这样就定义了一个SimpleEvent事件,下面为事件添加处理函数:

SimpleEvent += new EventHandler(OnSimpleEvent);

void OnSimpleEvent(object o, EventArsg e)

{

...

}

经典案例1

using System;


//


//程序设计:
猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)


//要求:


//1.要有联动性,老鼠和主人的行为是被动的。


//2.考虑可扩展性,猫的叫声可能引起其他联动效应。


//


//要点:1.
联动效果,运行代码只要执行Cat.Cryed()方法。2. 对老鼠和主人进行抽象


//评分标准:


//<1>.构造出Cat、Mouse、Master三个类,并能使程序运行(2分)


//<2>从Mouse和Master中提取抽象(5分)


//<3>联动效应,只要执行Cat.Cryed()就可以使老鼠逃跑,主人惊醒。(3分)




namespace
cmdText




{




/**////
<summary>


///
EventCat 的摘要说明。


///
</summary>


public
delegate
void SubEventHandler();




public
abstract
class Subject




{


public
event SubEventHandler SubEvent;


protected
void FireAway()




{


if (this.SubEvent
!= null)


this.SubEvent();


}


}




public
class Cat : Subject




{


public
void Cry()




{


Console.WriteLine("cat cryed.");


this.FireAway();


}


}




public
abstract
class Observer




{


public Observer(Subject sub)




{


sub.SubEvent
+= new SubEventHandler(Response);


}


public
abstract
void Response();


}




public
class Mouse : Observer




{


private
string name;


public Mouse(string
name, Subject sub) : base(sub)




{


this.name
= name;


}


public
override
void Response()




{


Console.WriteLine(name
+ " attempt to escape!");


}


}




public
class Master : Observer




{




public
Master(Subject sub) : base(sub){}


public
override
void Response()




{


Console.WriteLine("host waken");


}


}




class Class




{


static
void Main(string[] args)




{


Cat cat
= new Cat();


Mouse mouse1
= new Mouse("mouse1",
cat);


Mouse mouse2
= new Mouse("mouse2",
cat);


Master master
= new Master(cat);


cat.Cry();


Console.Read();


}




}


}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: