C 之委托和事件

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                        我想,读者们可能看过一部电影叫《全民目击》,在电影中,富豪林泰婚期将至,准新娘却惨死地下停车场,林泰的富二代女儿林萌萌成为最大嫌疑人,林泰不惜重金聘请国内顶级律师周莉为女儿辩护,而公诉方却是十多年一直追查林泰的童涛。随着法庭质证的深入,罪案真相却越来越扑朔迷离。所有人都深陷迷局,真相隐遁在迷雾之中。一如电影的主题,“人的一生,总有些东西比命还重要。”心灵的救赎,更发人深省。在电影中,林泰需要打官司,聘请国内顶级律师周莉为女儿萌萌辩护,然而律师真正执行的是当事人的陈词,这时候律师就是一个委托对象,当事人委托律师这个对象去帮助自己辩护,这就是我们电影中委托的例子,然而c#中委托的概念也就好比周莉律师这个对象,从中可以得出委托是一个类,因为只有类才有对象的概念,从而也体现了c#是面向对象的语言。

        在我们的程序世界中,委托也如电影这般简单么?当然,什么是OO,OO就是现实世界的抽象,所有现实世界的事物,在OO里都能得到很好的诠释,在我们的现实世界中,委托相当于一个命令,做事情的是别人,而在程序的世界里委托知识存储了各个方法的地址,而她自己什么都不做,接下来,我们举一个简单的例子,时至母亲节,姐姐委托妹妹去买康乃馨送给妈妈,怎么在程序的世界中体现呢?

       

//妹妹类    public class Meimie    {        //其实买康乃馨,辛苦的是妹妹        public static void BuyCarnation()        {            Console.WriteLine("老姐啊,一起买,才有心意!");        }    }    //姐姐类    class Jiejie    {        //声明一个委托,其实就是个“命令”        public delegate void BuyCarnation();        public static void Main(string[] args)        {            //这里就是具体阐述这个命令是干什么的,本例是meimei.BuyCarnation“妹妹买康乃馨”            BuyCarnationEventHandler myDelegate = new BuyCarnationEventHandler(meimei.BuyCarnation);            //这时候委托被附上了具体的方法            myDelegate();            Console.ReadKey();        }    } 
       其中,

       

 BuyCarnationEventHandler myDelegate = new BuyCarnationEventHandler(meimei.BuyCarnation);
       是委托的声明方法,BugCarnationEventHandler(委托的方法),委托的方法必须要加上,因为委托的构造函数是不为空的,注意,委托的参数和返回类型,都要和我们要具体委托的方法一致,如

        

 public delegate void BuyCarnationEventHandler()public static void BuyCarnation({   Console.WriteLine("老姐啊,一起买,才有心意!");  }
       说到委托,不得不提一下我们的事件,那么什么是事件呢?EVENT?Click Event,Load Event,一连串的概念冲击着我小小的脑袋,那么到底是什么事件呢?事件是类在发生其关注的事情时用来提供通知的一种方式,事件的发生一般都牵扯到两个角色,一个是事件发行者(Publisher),也称作是发送者(Sender),其实就是一个对象,这个对象会自行维护本身的状态信息,当本身状态信息变动时,便触发一个事件,并通知所有的事件订阅者;另一个是事件订阅者(Subscriber),对事件感兴趣的对象,也称为Receiver,可以注册感兴趣的事件,在事件发行者触发一个事件后,会自动执行这段代码,我们来举一个简单的例子,看看我们的“事件”是如何在我们的编程世界中完美体现的:

        

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication2{    //发布者(Publiser)    public class Publisher    {        //声明一个花店的委托        public delegate void PublishEventHander();        //在委托的机制下我们建立一个花店事件        public event PublishEventHander OnPublish;        //事件必须要在方法里去触发,花店出售康乃馨方法        public void issue()        {            //如果有人预定了这个事件,也就是这个事件不是空            if (OnPublish != null)            {                Console.WriteLine("表达爱意的康乃馨今天出售哦!");                OnPublish();            }        }    }    //Subscriber 预定者,妹妹    public class Jiejie    {        //对事件感兴趣的事情,这里指对花店康乃馨感兴趣        public static void Receive()        {            Console.WriteLine("噢耶,我已经收到表达爱意的康乃馨!!");        }    }    //Subscriber 预定者,妹妹    public class Meimei    {        //对事件感兴趣的事情        public static void Receive()        {            Console.WriteLine("妹妹,辛苦了!");        }    }    class Story    {        public static void Main(string[] args)        {            //实例化一个花店            Publisher publisher = new Publisher();            //给这个出售康乃馨事件感兴趣的预定者,此例中是妹妹            publisher.OnPublish += new Publisher.PublishEventHander(Jiejie.Receive);            //另一种事件注册方式            //publisher.OnPublish += Jiejie.Receive;            //发布者在这里触发出售康乃馨者的事件            publisher.issue();            Console.ReadKey();        }    }}
           运行效果如下:

           

           事件是一种特殊的委托,我们来看看两者的使用流程有什么不一样的地方:

         

        事件和委托有着密切的关系,声明一个事件语法和声明一个委托及其相似,唯一的区别就是添加Event关键字,她没有返回值,虽然一般用Public关键字修饰,但是事件无法在外部触发,而委托却可以在外部直接调用,.Net Framework使用委托来提供实现事件驱动的机制,委托是一个方法列表,事件可以看成是委托的特例。C#之旅,未完,待续......

         

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

这里写图片描述

猜你喜欢

转载自blog.csdn.net/gfjjggg/article/details/84195741