• 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;
            }
        }
  • 相关阅读:
    九度oj 题目1525:子串逆序打印
    九度oj 题目1516:调整数组顺序使奇数位于偶数前面
    九度oj 题目1490:字符串链接
    九度oj 题目1438:最小公倍数
    九度oj 题目1181:遍历链表
    九度oj 题目1179:阶乘
    九度oj 题目1077:最大序列和
    九度oj 题目1075:斐波那契数列
    九度oj 题目1074:对称平方数
    九度oj 题目1073:杨辉三角形
  • 原文地址:https://www.cnblogs.com/zhangweizhong/p/6775720.html
Copyright © 2020-2023  润新知