zoukankan      html  css  js  c++  java
  • 事件Event 介绍总结

      最近在总结一些基础的东西,主要是学起来很难懂,但是在日常又有可能会经常用到的东西。前面介绍了 C# 的 AutoResetEvent的使用介绍, 这次介绍事件(event)。

      事件(event),对于初学者来说,确实比较神秘,难懂。但是在日常编程过程中却经常遇到。事件使用得当,会让你的代码更加整洁,也能少些很多代码。

      一、Event事件,是一种封装过的委托。

      它拥有以下三要素:

        1. 事件发行者:达到某些条件时激发事件的对象

        2. 事件订阅者:订阅事件并对事件发生时进行处理的对象

        3. 定义发行者和订阅者关系,一个发行者可能会有多个订阅者。

      事件发行者和事件订阅者通过委托(delegate) 来实现发送方和接收方的事件触发。


      它拥有哪些好处:

        在以往我们编写订阅这类程序中,往往采用等待机制,为了等待某件事情的发生,需要不断地检测事情什么时候发生,而通过事件(event),可以大大简化了这种过程:

        1. 使用事件,可以很方便地确定程序执行顺序。

        2. 当事件驱动程序等待事件时,它不占用很多资源。事件驱动程序与过程式程序最大的不同就在于,程序不再不停地检查输入设备,而是呆着不动,等待消息的到来,每个输入的消息会被排进队列,等待程序处理它。如果没有消息在等待,则程序会把控制交回给操作系统,以运行其他程序。

        3. 事件简化了编程。事件订阅者只是简单地将消息传送给事件发行者,由发行者的事件驱动程序确定事件的处理方法。不必知道程序的内部订阅触发机制,只是需要知道如何传递消息即可。


      二、事件和委托的区别

        1.委托允许直接通过委托去访问相应的处理函数,而事件只能通过公布的回调函数去调用,

        2.事件只能通过“+=”,“-=”方式注册和取消订户处理函数,而委托除此之外还可以使用“=”直接赋值处理函数。

      三、事件的声明(Event)

        在类的内部声明事件,首先必须声明该事件的委托类型。例如:

        public delegate void NumManipulationHandler(NumEventArgs e);

        然后,声明事件本身,使用 event 关键字:

        // 基于上面的委托定义事件
        public event NumManipulationHandler ChangeNum;

        上面的代码定义了一个名为 NumManipulationHandler 的委托和一个名为 ChangeNum 的事件,该事件是在某个值生成的时候会调用委托事件。

      四、实例

    复制代码
        public class Program
        {
            public static void Main()
            {
    
                NumEvent even = new NumEvent(0);
                even.ChangeNum += EventAction.Action;
    
                even.SetValue(7);
                even.SetValue(11);
    
                System.Console.ReadKey();
            }
        }
    
        public class NumEvent
        {
            private int value;
    
            public delegate void NumManipulationHandler(NumEventArgs e);
    
            public event NumManipulationHandler ChangeNum;
    
            public virtual void OnChangeNum(NumEventArgs e)
            {
                ChangeNum?.Invoke(e);
            }
    
            public NumEvent(int n)
            {
                SetValue(n);
            }
    
            public void SetValue(int n)
            {
                if (value != n)
                {
                    NumEventArgs e = new NumEventArgs(n);
                    value = n;
                    OnChangeNum(e);
                }
            }
        }
    
        public class EventAction
        {
            public static void Action(NumEventArgs e)
            {
                System.Console.WriteLine("value : " + e.value);
            }
        }
    
        public class NumEventArgs : EventArgs
        {
            public int value;
            public NumEventArgs(int _value)
            {
                this.value = _value;
            }
        }
    复制代码

     转自=https://www.cnblogs.com/zhangweizhong/p/6775720.html

  • 相关阅读:
    springMvc 4.0 jackson包改变
    spring 获取bean的几种方式
    添加@ControllerAdvice后报错 Failed to invoke @ExceptionHandler method
    Cglib学习报错 java.lang.reflect.InvocationTargetException-->null
    JDK动态proxy原理解析
    (转)jquery $.proxy的使用
    (转)jQuery的deferred对象详解
    (转)JavaScript中==和===的区别
    (扫盲)jQuery extend()和jQuery.fn.extend()的区别
    (转)js中__proto__和prototype的区别和关系
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9944304.html
Copyright © 2011-2022 走看看