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

【C#】委托和事件

2016-09-25 16:45 267 查看
一、前提:

    最近在备战软考,复习观察者模式的过程中再次接触到了委托和事件。可谓是一脸懵逼啊,看来欠下的总是要还的,当初委托和事件匆匆而过,没有留下丝毫痕迹,今天还需再战。

二、生活中类“委托”示例:

    张三、李四、王五三个人是大学同学,一天,他们三个人同时收到了申通快递的短信,需要去拿快递,由于王五吃苦耐劳,为人陈恳。因此,张三、李四一合计,把取快递的任务“委托”给了王五,让他一并取回。这就是现实生活中非常常见的“委托”。

三、定义:

    委托是对函数的封装,是函数的“类”。委托的实例将代表一个具体的函数。而事件是委托的一种特殊形式。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。而且,一个委托可以搭载多个方法。简单来说,委托是一种方法容器,里面可以装载若干个拥有相同参数和返回值类型的方法。那么调用委托,就相当于同时调用了该容器内的所有方法。委托可以将方法作为参数传递给方法。

    委托对象用关键字delegate来声明。事件对象用event关键字声明。

四、实战:

    声明一个委托,名称叫“CatShotEventHandler”,无参数,无返回值。

    public delegate void CatShotEventHandler();

   声明一个public事件CatShout,它的事件类型是委托CatShotEventHandler。这表明事件发生时,执行被委托的方法。

1、Cat类

<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">class Cat
{
private string name;
public Cat(string name)
{
this.name = name;
}

public delegate void CatShoutEventHandler();//声明委托CatShoutEventHandler

public event CatShoutEventHandler CatShout;   //声明事件CatShout,它的事件类型是委托CatShoutEventHandler

public void shout()
{
Console.WriteLine("喵,我是{}.",name);

if(CatShout !=null)
{
CatShout();//当执行Shout()方法时,如果事件 CatShout中有对象登记事件,则执行CatShout()
}
}
}</span></span>
2、Mouse类

<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">class Mouse
{
private string name;
public Mouse(string name)
{
this.name = name;
}

public void Run()
{
Console.WriteLine("老猫来了,{}快跑!",name);
}
}

</span></span>
     Cat类和Mouse类和我们以往声明类的方式相差不多。关键是Main函数的写法。

<span style="font-family:KaiTi_GB2312;font-size:24px;"><span style="font-family:KaiTi_GB2312;font-size:24px;">
static void Main(string[] args)
{
Cat cat = new Cat("Tom");
Mouse mouse1 = new Mouse("Jerry");
Mouse mouse2 = new Mouse("Jack");

cat.CatShout += new Cat.CatShoutEventHanler(mouse1.Run);
cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);

//  "+="表示Add,增加委托实例对象。表示将Mouse的Run方法通过<strong>实例化</strong>委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。
cat.Shout();

Console.Read();
}</span></span>


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