• 事件和委托的区别


    很多人说,事件即委托。真的是这样吗?那么微软为何又要定义事件与委托两个概念呢?
    其实事件即委托,在我看来不如这样解释:事件是封装过的委托实例。也就是说,事件是面向对象的产物,它是封装性比较典型的示例。

    事件实际上是一个特殊的委托实例,不用事件也没有关系。实际上事件只是削弱了委托的功能,event在编译器角度保护了你程序的安全,因为你只能使用+=、-=来注册事件了,而不能使用 = 为事件关联方法。(在委托中还可以使用=来绑定方法,不过=是一种破坏性代码,不管之前是否已经绑定的有方法了,他都会将其清除)

    同一个方法你可以使用委托来调用,你也可以使用事件来调用。那究竟有何不同?
    其实事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托.你可以在客户代码中直接调用委托来激发委托指向的函数,而事件不可以,事件的触发只能由服务代码自己触发。也就是说在你的代码里委托你不但可以安排谁是它的调用函数,还可以直接调用它,而事件不能直接调用,只能通过某些操作触发。除此之此,事件拥有委托的所有功能,包括多播特性。即事件可以有多个事件处理函数,委托同样也可以是个多播委托.

    public class Heater
    {
      private int temperature;
      public void BoilWater()
      {
        for (int i = 1; i <= 100; i++)
        {
          temperature = i;
          if (temperature > 95 && BoilEvent != null)
          {
            //执行委托,无需知道要执行哪些方法
            BoilEvent(temperature);
          }
        }
      }
      public delegate void BoilHandle(int param);
      public event BoilHandle BoilEvent;//封装了委托
    }
    public class Alarm
    {
      public void MakeAlert(int param)
      {
        Console.WriteLine("Alarm:水温已经超过{0}度.",param);
      }
    }
    public class Display
    {
      public void ShowMsg(int param)
      {
        Console.WriteLine("Display:水已烧开,当前温度{0}度.", param);
      }
    }
    [TestClass]
    public class UnitTest1
    {
      [TestMethod]
      public void TestMethod1()
      {
        Heater heater = new Heater();
        Alarm alarm = new Alarm();
        heater.BoilEvent += alarm.MakeAlert;
        heater.BoilEvent += new Display().ShowMsg;
        heater.BoilWater();
      }
    }

  • 相关阅读:
    Discuz 模板语句分析及知识技巧
    phpcms v9添加新模块
    simplexml 对xml的增删改操纵
    phpcms V9 相关阅读/相关文章
    怎么让php生成的网页源代码开头不出现空行
    phpcms v9 如何实现标签的嵌套
    在{pc:content action="lists"标签中加自定义限制条件的办法
    phpcms v9 内容页浏览数不显示问题
    【今日CV 视觉论文速览】29 Nov 2018
    【词云】wordcloud安装与使用
  • 原文地址:https://www.cnblogs.com/fantaohaoyou/p/9402745.html
Copyright © 2020-2023  润新知