委托和事件的区别

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

有了委托为什么还需要事件?笔者认为事件是为了对委托进一步封装,更能体现面向对象的思想,也使得程序具有更大的灵活性。

下面看一个观察者模式的代码。需求是:假设我们有个高档的热水器,我们给它通上电,当水温超过95度的时候:1、扬声器会开始发出语音,告诉你水的温度;2、液晶屏也会改变水温的显示,来提示水已经快烧开了。

热水器代码:

/// <summary>
    /// 热水器
    /// </summary>
    public class Heater
    {
        private int temperature;
        public string type = "RealFire 001";    // 添加型号作为演示    
        public string area = "China Xian";       // 添加产地作为演示 
        //声明委托 
        public delegate void BoiledEventHandler(Object sender, BoliedEventArgs e);
        //声明事件
        public event BoiledEventHandler Boiled;

        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视    
        protected virtual void OnBolied(BoliedEventArgs e)
        {
            // 如果有对象注册 
            if (Boiled != null)
            {
                Boiled(this, e); // 调用所有注册对象的方法      
            }
        }

        // 烧水。 
        public void BoilWater()
        {
            for (int i = 0; i <= 100; i++)
            {
                temperature = i;
                if (temperature > 95)
                {
                    //建立BoliedEventArgs 对象。 
                    BoliedEventArgs e = new BoliedEventArgs(temperature);
                    // 调用 OnBolied方法
                    OnBolied(e);
                }
            }
        }
    }

事件相关参数:

public class BoliedEventArgs : EventArgs
    {
        public readonly int temperature;
        public BoliedEventArgs(int temperature)
        {
            this.temperature = temperature;
        }
    }

警报器:

/// <summary>
    /// 警报器
    /// </summary>
    public class Alarm
    {
        public void MakeAlert(Object sender, BoliedEventArgs e)
        {
            Heater heater = (Heater)sender;
            //访问 sender 中的公共字段 
            Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
            Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
            Console.WriteLine();
        }
    }

显示器:

/// <summary>
    /// 显示器
    /// </summary>
    public class Display
    {
        //静态方法
        public static void ShowMsg(Object sender, BoliedEventArgs e)
        {
            Heater heater = (Heater)sender;
            Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
            Console.WriteLine();
        }
    }

代码调用:

            Heater heater = new Heater();
            Alarm alarm = new Alarm();
            heater.Boiled += alarm.MakeAlert; //注册方法 
            heater.Boiled += (new Alarm()).MakeAlert;    //给匿名对象注册方法 
            heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert); //也可以这么注册       
            heater.Boiled += Display.ShowMsg;    //注册静态方法
            heater.BoilWater(); //烧水,会自动调用注册过对象的方法
            Console.ReadLine();
时间: 2024-10-12 23:28:17

委托和事件的区别的相关文章

c# 委托与事件的区别

委托与事件的区别 委托和事件没有可比性,因为委托是数据类型,事件是对象(可以理解为对委托变量的封装.),下面说的是委托的对象(用委托方式实现的事件)和(标准的event方式实现)事件的区别.事件的内部是用委托实现的.(举例子:三种实现事件方式的区别(直接用委托实现.用私有委托+公有方法模拟事件,直接用event事件实现)) 因为对于事件来讲,外部只能“注册自己+=.注销自己-=”,外界不可以注销其他的注册者,外界不可以主动触发事件,因此如果用Delegate就没法进行上面的控制,因此诞生了事件这

c#之委托和事件的区别

下面开始对事件进行介绍 1.定义事件以及事件的编译原理 首先定义事件对应的委托: 1 public delegate void ThreeClickEventDel(); 然后对应事件变量:(其实就是在委托前面加一个event) public event ThreeClickEventDel ThreeClickEvent; 反编译之后:是:一个“私有委托”和两个“公有”的“add”和“remover”方法 1)因为是私有委托:所以只有类的内部可以调用,在类外部就不能被调用.创建的类的实例也是不

C#中委托和事件的区别实例解析

这篇文章主要介绍了C#中委托和事件的区别,并分别以实例形式展示了通过委托执行方法与通过事件执行方法,以及相关的执行流程与原理分析,需要的朋友可以参考下 本文实例分析了C#中委托和事件的区别,分享给大家供大家参考之用.具体如下: 大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. 一.通过委托执行方法 1 2 3 4 5 6 7 8 9 10 11 12 13 1

C#中委托和事件的区别

大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法.事件可以被看作一个委托类型的变量,通过事件注册.取消多个委托或方法.本篇分别通过委托和事件执行多个方法,从中体会两者的区别. □ 通过委托执行方法 class Program { static void Main(string[] args) { Example example = new Example(); example.Go(); Console.ReadKey(); } } public class Example { pu

C#一些知识点:委托和事件的区别

在C#中,委托和事件是比较容易混淆的两个知识点,本篇博客就记录一下委托和事件之间的区别. 定义上的区别 委托:委托实际上是一个类,用来表示一个函数,可以理解为C++中的函数指针. 事件:事件是一个修饰符,用来修饰一个委托类型的属性,表示该委托的部分功能被限制了. 我们可以这么理解:委托是类,定义了委托后,就可以像使用类一样的来使用这个委托,而事件修饰了委托后则是表示限制这个委托的部分功能,使其满足作为事件的规则. 那么事件究竟限制了委托的什么功能呢?主要是下面的这两个限制: 调用的限制 委托的调

委托与事件的区别

截止到目前为止,我很少使用事件,经常使用委托,但是我并不清楚事件存在的原因,或者说,委托和事件到底有什么区别? 我在网上搜的一般情况下都会写委托是一个类,事件是委托的对象,但是用的时候会发现, 执行出来完全一模一样,什么调用Invoke,什么Remove和-=,如果这就是区别,那事件存在的意义在哪里? 马克思说过:存在即合理 后来我又搜了一些博客,看了一下终于让我找到了我认为最本质的区 区别主要在外部触发,事件是不允许的,具体看下边例子: 事件ActEvent在外部只能出现在+=或者-=的左边,

C#委托和事件的区别

“委托是具有相同签名的函数(方法)的类型,事件是委托的应用方式之一” ---来自评论区老司机 delegate 是为了在C#中把函数作为对象传来传去而实现的一个“函数包装”.由于在C#中函数是二等公民,你不能把它定义在class的层级上,也不能把它作为对象来传递.因此平台提供了一个盛放函数的“容器“,当你声明了一个这样的容器后,它里面就可以放进所有和你声明时签名一致的函数或方法. 因为每次声明和创建委托都是在做重复性的工作,不符合OOP的气质,微软提供了泛型委托: Action  无参没有返回值

浅谈委托和事件(一)

浅谈委托和事件(一) 关于委托和事件,可能是.NET或者说是面向对象编程语言中的一个比较重要又比较难以理解的概念.关于这一话题,园子里的人也写了很多文章,最经典的可能就是张子阳的C#中的委托和事件这两篇文章了,之前也看过MSDN 上的WebCast深入 "委托和事件".可能和很多人一样,刚开始读的时候,觉得很清楚,但是过了一段时间好像又忘记了委托和事件的区别,知道很久以前,在一次面试中我被问到委托和事件有什么区别,一下子就说不清了. 所以这里稍微理一下,也算是自己的一个总结.当然,还是

C#委托与事件学习笔记

今天跟随视频学习了一下C#中最重要的一些概念之委托与事件.老杨的视频讲的还是挺深入浅出,不过刚接触C#.NET的人还是朦朦胧胧,就像张子阳先生说的"每次见到委托和事件就觉得心里别(biè)得慌,混身不自在".跨过这道坎的人就有种一览众山小的感觉了.我又浏览了皱华栋老师JamesZou的博文<深入理解C#委托及原理>(地址:http://www.cnblogs.com/jameszou/archive/2011/07/21/2112497.html),以及张子阳Jimmy Z