【C#】委托和事件

一、前提:

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


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

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


三、定义:

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

    委托对象用关键字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>









        


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值