zoukankan      html  css  js  c++  java
  • 委托与事件

      前面已经具体说明了委托,这里重点解析事件。(关于委托和Lambda:委托与Lambda表达式

    一.委托与事件的关系:

      • 委托可以理解为指向一个方法的数据类型
      • 由于委托外界只需要通过一个委托变量接收委托,就可以随意的调用了。非常不安全,事件对委托做了封装。使得外界不能随便调用
      • 事件内部是通过委托来实现的
    • 为了方便操作委托,体统提供了三种泛型委托:
      • Action                 //无返回值泛型委托
      • Func                   //有返回值泛型委托,最后一位为:返回值
      • predicate             //返回值为bool的泛型委托
    • 匿名方法:
      • Predicate<string> p = delegate(string str) { return true; };
    • 事件处理:
      • 事件是基于EventHandleEventArgs基类的
        • 第一个参数 sender,其中object类型的参数 sender表示的是发送消息的对象,为什么要使用object类型呢,这是因为不同类型的对象调用时使用object能很好的兼容
        • 第二个参数 e,他的类型为EventArgs.EventArgs这个类没有实际的用途,只是作为一个基类让其他对象继承。很多对象不需要传递额外的信息,例如按钮事件,只是调用一个回调方法就够了。当我们定义的事件不需要传递额外的信息时,这时调用EventArgs.Empty就行了,不需要重新构建一个EventArgs对象

    二.事件的定义:

      事件(event)的声明的语法如下:

        public  event  委托类型  事件名;

    例子:

            //定义一个委托
             public delegate void delegateRun();
             //定义一个事件
             public event delegateRun eventRun;

       事件的使用方法:

    class Program
    {
        static void Main(string[] args)
        {
            EvtHandler evt = new EvtHandler();
            evt.evtAct += evt_evtAct;
            evt.evtHandler += evt_evtHandler;
            evt.handler();
            Console.ReadKey();
        }
        static void evt_evtHandler(object sender, EventArgs e)
        {
            Console.WriteLine("事件处理者");
        }
        static void evt_evtAct()
        {
            Console.WriteLine( "委托事件");
        }
    }
    public class EvtHandler
    {
        public event EventHandler evtHandler;
        public event Action evtAct;
        public void handler()
        {
            evtHandler(null,null);
            evtAct();
        }
    }
    事件的使用方法

    三.使用事件需要的步骤:

      1. 创建委托
      2. 将创建的委托与特定事件关联(事件发生时,我们要执行的方法的时候,我们需要和这个委托有相同的签名
      3. 编写事件处理程序
      4. 利用编写的C#事件处理程序生成一个委托实例
      5. 把这个委托实例添加到产生事件对象的事件列表中去,这个过程又叫订阅事件

    四.订阅事件:

        定义好事件后,与事件有关的人会订阅事件,只有订阅事件的对象才会收到发生事件的通知,没有订阅该事件的对象则不会收到通知。

        订阅事件的语法如下:

            事件名+=new 委托名(方法名);

    五.引发事件:

      public event MyDel eventRun;

      public void Begin()

        {
              eventRun();
        }
  • 相关阅读:
    智能合约初体验
    安装solidity遇见的问题——unused variable 'returned'
    Clojure学习笔记(二)——函数式编程
    《Java虚拟机并发编程》学习笔记
    Clojure学习笔记(一)——介绍、安装和语法
    Ubuntu配置pyethapp
    no leveldbjni64-1.8 in java.library.path
    Merkle Patricia Tree (MPT) 树详解
    Ubuntu下配置和编译cpp-ethereum客户端
    conda安装python库出现ssl error
  • 原文地址:https://www.cnblogs.com/fengxuehuanlin/p/6536525.html
Copyright © 2011-2022 走看看