C#委托和事件

来源:互联网 发布:淘宝买保险好吗 编辑:程序博客网 时间:2024/05/20 17:24
一、委托和类一样,是一种用户自定义类型,它可以实现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”。
0 0
原创粉丝点击