【C#】委托和事件
2016-09-25 16:45
267 查看
一、前提:
最近在备战软考,复习观察者模式的过程中再次接触到了委托和事件。可谓是一脸懵逼啊,看来欠下的总是要还的,当初委托和事件匆匆而过,没有留下丝毫痕迹,今天还需再战。
二、生活中类“委托”示例:
张三、李四、王五三个人是大学同学,一天,他们三个人同时收到了申通快递的短信,需要去拿快递,由于王五吃苦耐劳,为人陈恳。因此,张三、李四一合计,把取快递的任务“委托”给了王五,让他一并取回。这就是现实生活中非常常见的“委托”。
三、定义:
委托是对函数的封装,是函数的“类”。委托的实例将代表一个具体的函数。而事件是委托的一种特殊形式。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。而且,一个委托可以搭载多个方法。简单来说,委托是一种方法容器,里面可以装载若干个拥有相同参数和返回值类型的方法。那么调用委托,就相当于同时调用了该容器内的所有方法。委托可以将方法作为参数传递给方法。
委托对象用关键字delegate来声明。事件对象用event关键字声明。
四、实战:
声明一个委托,名称叫“CatShotEventHandler”,无参数,无返回值。
public delegate void CatShotEventHandler();
声明一个public事件CatShout,它的事件类型是委托CatShotEventHandler。这表明事件发生时,执行被委托的方法。
1、Cat类
最近在备战软考,复习观察者模式的过程中再次接触到了委托和事件。可谓是一脸懵逼啊,看来欠下的总是要还的,当初委托和事件匆匆而过,没有留下丝毫痕迹,今天还需再战。
二、生活中类“委托”示例:
张三、李四、王五三个人是大学同学,一天,他们三个人同时收到了申通快递的短信,需要去拿快递,由于王五吃苦耐劳,为人陈恳。因此,张三、李四一合计,把取快递的任务“委托”给了王五,让他一并取回。这就是现实生活中非常常见的“委托”。
三、定义:
委托是对函数的封装,是函数的“类”。委托的实例将代表一个具体的函数。而事件是委托的一种特殊形式。一旦为委托分配了方法,委托将于该方法具有完全相同的行为。而且,一个委托可以搭载多个方法。简单来说,委托是一种方法容器,里面可以装载若干个拥有相同参数和返回值类型的方法。那么调用委托,就相当于同时调用了该容器内的所有方法。委托可以将方法作为参数传递给方法。
委托对象用关键字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>
相关文章推荐
- 用 C++ 实现 C# 中的 委托/事件 (2-delegate event functor)
- 深入理解C#编程中的组件-事件-委托
- 我对C#中事件委托的通俗看法
- C#里的委托和事件实现Observer
- C#中利用委托传递事件
- C#中的组件-事件-委托
- C#委托及事件
- C#中的委托与事件
- C#-委托和事件
- C#中委托,事件理解入门
- 用C++实现C#中的委托/事件(标准C++之升级版)
- C#的事件处理与委托
- C#里的委托和事件实现
- C#中的委托与事件[翻译]
- C#里的委托和事件实现Observer
- C#体验·委托和事件
- 用 C++ 实现 C# 中的 委托/事件 (5-functor2)
- C#中,对委托和事件的理解
- 在C#的事件、多播中使用委托
- C# 事件 委托 教程