C#委托和事件

一、委托和类一样,是一种用户自定义类型,它可以实现C++中函数指针的功能,且比函数指针更安全,功能更多!

1、委托声明:
delegate void  AnimalPlay(string name) ; //AnimaPlay是委托的类型

2、委托实例化:
委托在使用时和类一样(除Static类型的类)要实例化,如下:deleDogPlay就是委托的实例
AnimalPlay  deleDogPlay = new AnimalPlay(DogPlay); //DogPlay是符合委托声明的函数格式的函数

3、委托可像函数指针一样当做一个函数的参数,传入函数中。如下:
static void CircusStart( AnimalPlay animalPlay, string name)
{
Console.WriteLine(" 女士们,先生们,我们的马戏表演开始了! ");
animalPlay(name);
//其他代码
//……
}
CircusStart( deleDogPlay, "Good evening");
CircusStart( DogPlay, "Snoopy"); //新版的.net可直接传入函数名(自动转换),而不需要传入实例化的委托。

4、多播委托:即委托中注册多个函数
当调用委托时,按一定顺序(未定义按什么顺序)调用所有注册的函数。一般是用于返回值为Void的函数类型委托。如果返回值不是Void,执行委托时返回值为最后一次调用的函数的返回值。(但哪个函数被最后调用不知道)
AnimalPlay animalsPlay = new AnimalPlay(DogPlay);
animalsPlay += new AnimalPlay(CatPlay);//CatPlay 是符合委托声明的函数格式的函数

5、 另外,委托可以使用匿名函数   Lambda表达式(简化匿名函数的表达)实例化!
6、
  宽松委托
委托函数的参数类型可以是委托参数的基类(逆变),被委托函数的返回值类型可以是委托返回值的派生类(协变)
public delegate Animal AnimalHandler(Animal a); //委托
public static Cat CatPlay(Object o) //被委托函数
{
return null;
}
则下面的语句是合法的:
AnimalHandler handler = new AnimalHandler(CatPlay);


二、事件实质上是个委托实例,NET 通过委托机制系统应用程序中的事件处理程序联系起来了

1、关于事件的委托声明,如下EventHandler 事件的委托类型
public delegate void  EventHandler(object sender, EventArgs e);//Sender参数表示事件的发送至,e表示消息本身

2、事件的声明,和委托的实例化差不多,只是声明前要加event关键字
public  event EventHandler  Click;
public  event EventHandler  KeyPress;

event 关键字的作用是把事件封装起来,即只能在声明事件的 类的内部触发事件,在类外部只能注册事件而不能触发事件。比如对于在 btnOK 里声明的 Click 事件,语句 “btnOK.Click()”只能出现在 btnOK 类内部,不能出现在类外部(尽管 Click 是公有的)。对于普通的没有用 event 关键字修饰的公有委托,则可以在类外调用。

3、事件的注册:
btnOK.Click += new System.EventHandler(this. btnOK_Click);//btnOK_Click是事件的处理程序

4、要创建一个事件驱动的程序需要下面的步骤:
(1)声明关于事件的委托;//在dog类中
public delegate void AlarmEventHandler(object sender, EventArgs e);

(2)声明事件(委托的实例化);//在dog类中
public event AlarmEventHandler Alarm;

(3)编写触发事件的函数;//在dog类中

public void OnAlarm()
{
if (this.Alarm != null)
this.Alarm(this, new EventArgs()) ; //发出警报
}

(4)创建事件处理程序;//在Host类中
void HostHandleAlarm(object sender, EventArgs e)
{
Console.WriteLine(" 主 人: 抓住了小偷! ");
}

(5)注册事件处理程序;//在Host类中
public Host(Dog dog)
{
dog.Alarm += new Dog.AlarmEventHandler(HostHandleAlarm);
}

(6)在适当的条件下触发事件。//在其他类中
dog.OnAlarm();

总的来说:
委托的相当于函数类型,委托实例相当于函数的别名,它的功能是实现一个接口,从而编写出通用的函数。事件的本质是一种委托实例,它是系统和用户定义的事件处理程序之间的桥梁。

注: 事件处理委托习惯上以  EventHandler  结尾
注: 引发事件的代码常常被编写成一个函数, .NET 约定这种函数的名称为 “OnEventName”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值