委托与事件

来源:互联网 发布:手机qq电话录音软件 编辑:程序博客网 时间:2024/06/05 05:32
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 委托与事件{    class Program    {        static void Main(string[] args)        {            Cat cat = new Cat("Tom");            Mouse mouse1 = new Mouse("Jerry");            Mouse mouse2 = new Mouse("Jack");            // 将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。            cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run);            cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);            cat.Shout();        }    }    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("喵,我是{0}.", name);            if (CatShout != null)            {                CatShout(); // 当执行Shout()方法的时候,如果CatShout中有对象登记事件,则执行CatShout()            }        }    }    class Mouse    {        private string name;        public Mouse(string name)        {            this.name = name;        }        public void Run()        {            Console.WriteLine("老猫来了,{0}快跑!", name);        }    }}


事件(Event)是类或对象向其他类或对象通知发生的事情的一种特殊签名的委托.

什么是委托?

  如果我们要把方法当做参数来传递的话,就要用到委托。简单来说委托是一个类型,这个类型可以赋值一个方法的引用。

有什么不同:

委托类型可以声明一个局部变量

而事件只能在类的成员里面声明

委托是一种类型,事件是一种成员

1.C#中的事件和委托的作用?事件代表一个组件能够被关注的一种信号,比如你的大肠会向你发出想拉屎的信号,你就可以接收到上厕所。委托是可以把一个过程封装成变量进行传递并且执行的对象,比如你上蹲坑和上坐马桶拉屎的方式是不一样的,但是你的大脑不需要知道两种方式的不同,只需要在蹲坑的时候获取身体用于蹲位姿势的委托进行调用拉屎,在坐马桶的时候获取坐姿的委托进行调用拉屎。2.他们之间的关系?委托是一种类型,事件是一种成员,就相当于public int Age {get;set;}这个属性中,int就是类型,Age是一个成员,public event EventHandler Push;这个事件中EventHandler就是委托类型,Push是事件他是一个成员。3.和什么情况使用委托和事件?事件是组件中的抽象概念,同样包括状态和操作也是组件中的概念,对应到C#里面就是属性和方法。所以像控件之类的组件都会有事件。而委托代表一个代码的执行过程,C#3.0引入linq以后,用的就非常频繁了。4.但是用事件的方式来调用的话有什么好处?事件是一种封装,就好像属性会封装字段一样,可以把定义和实现隔离开来,给你举个例子就是DateTime实际上你看那么多属性,其实里面只有一个字段存储时间,各种日期啊年啊属性都是根据这个时间算出来的。事件也把内部类型为一个委托的字段封装起来,这样在类的外部就只能使用事件来注册或者注销事件关注,而不能引发事件。就好像你拉不拉屎不由其他人控制一样。   5.添加了委托一定要再定义事件来调用么?看情况,你可以不用属性封装字段,但是在代码设计上来说,或者面向组件设计上来说,封装是一种设计原则,你学过设计模式,或者参与过大型系统的设计就会很容易理解这点。   6/什么情况下只要使用委托就可以,什么情况下必须配合事件使用?一般情况下建立组件模型都使用事件



0 0
原创粉丝点击