zoukankan      html  css  js  c++  java
  • C#总结(二)事件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;
            }
        }
  • 相关阅读:
    Django学习笔记
    禁用Win10自带截图工具快捷键(Shift+Win+S)
    Linux基础知识
    Ubuntu中配置Python虚拟环境Virtualenv
    PyCharm 格式化代码 常用快捷键
    你不得不知道的HashMap面试连环炮
    大型互联网公司分布式ID方案总结
    Java程序员必会常用Linux速查手册
    面试题:InnoDB中一棵B+树能存多少行数据?
    C语言:标准IO_fopen( )、fclose() ①
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/6775720.html
Copyright © 2011-2022 走看看