• 事件(复习)


    相关概念:

    触发(raise)事件:调用或触发事件的术语。当事件被触发时,所有注册到它的方法都会被依次调用。

    发布者(publisher):让事件被其他类或结构可见并使用的类或结构。

    订阅者(subscribert):把事件和发布者关联注册的类或结构。

    事件处理程序(event handler):注册到事件的方法。可以在事件所在的类或结构中,或者在不同的类或结构中。

     

    事件与委托的关系

    Event关键字会为我们做了两件事:

    1.创建好一个对应的private的委托对象。

    2.创建了一个【事件属性】,里面包含了addremove方法,他们都是直接操作上面的私有委托对象。

    如下:

     

    namespace 事件与委托的关系
    
    {
    
        class Program
    
        {
    
            static void Main(string[] args)
    
            {
    
            }
    
        }
    
     
    
        class MyHandler
    
        {
    
            private string _name;
    
     
    
            public string Name
    
            {
    
                get { return _name; }
    
                set { _name = value; }
    
            }
    
     
    
            public event EventHandler MyEvent;
    
        }
    
    }
    

     

      

    生成Exe文件后,在反编译器里查看:

     

    总结:

    1.事件提供了对它的私有控制委托的结构化访问(创建了对应的私有委托对象字段,同时为该属性创建了addremove方法

    2.与委托中的其他操作不一样,对于事件我们只可以添加、删除或调用事件处理程序(这个只是相对于订阅者所言,事件发布者可以使用委托其他操作【原因1】)。

    3.事件被触发时,它调用委托来依次调用列表中的方法

    4.事件是成员: 不能使用对象创建表达式(new表达式)来创建它的对象。

    必须声明在类或结构中,和其他成员一样;

    事件成员被隐式自动初始化为Null.

     

    委托类型与EventHandler

     

    复习的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 事件与委托的关系
    {
        public delegate void MyDelegate();
        /// <summary>
        /// 订阅者类
        /// </summary>
        class Program
        {
            
            static void Main(string[] args)
            {
                Console.WriteLine("请输入任意字符继续……");
                Console.ReadKey();
                MyHandler mh = new MyHandler();
                //添加事件
                mh.MyEvent += addMethod1;
                mh.MyEvent += delegate { Console.WriteLine("你好,你调用了匿名方法"); };
                mh.MyEvent += () => { Console.WriteLine("你好,你调用了Lamada方法"); };
                mh.Test();
                Console.Read();
            }
            private static void addMethod1()
            {
                
                Console.WriteLine("你好,你调用了addMethod1方法");
                
            }
            private static void addMethod2()
            {
    
                Console.WriteLine("你好,你调用了addMethod2方法");
    
            }
            private static void addMethod3()
            {
    
                Console.WriteLine("你好,你调用了addMethod3方法");
    
            }
        }
    
        /// <summary>
        /// 发布者类
        /// </summary>
        class MyHandler
        {
            private string _name;
    
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
            
            public event MyDelegate MyEvent;
    
            /// <summary>
            /// 触发事件的方法
            /// </summary>
            public void Test()
            {
                MyEvent();
            }
        }
    }
    

     

      

     

  • 相关阅读:
    Git: git tag 使用小结(给发布版本打标记,切换并修改某个历史版本)
    android: Android水波纹点击效果
    Flutter: 运行新项目报错
    FFmpeg编译:mac下编译iOS平台的FFmpeg库(支持armv7, arm64, i386, x86_64)
    Xcode: Xcode中Command Line Tools的安装方法
    win10: windows+E 改回打开我的电脑
    DialogFragment: DialogFragment的一些理解
    Android Studio: 查看SDK源代码
    HandlerThread: HandlerThread的理解
    Looper: Looper,Handler,MessageQueue三者之间的联系
  • 原文地址:https://www.cnblogs.com/vscnblogs/p/2667866.html
Copyright © 2020-2023  润新知