zoukankan      html  css  js  c++  java
  • c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件。以下思明仍然从事件是什么、为什么用事件、怎么实现事件和总结介绍一下事件 

    1、事件是什么:.

          1.1 NET事件建立在委托机制之上,事件是对委托的封装。

        1.2 事件的分类: 强类型事件和弱类型事件

    2、为什么用事件:

      从上文委托入门介绍中我们可以了解到,我们可以在客户端随意对委托进行操作,一定程度上破坏了面向对象的封装机制,因此事件的出现就是为了实现对委托的封装

    3、怎么实现事件:

       其实事件的定义很简单,但是需要依赖委托:关键字event就是事件的标识

            /// <summary>
            /// 1、定义一个委托
            /// </summary>
            /// <param name="x"></param>
            public delegate void BoilHandler(int x);
    
            /// <summary>
            /// 2、声明一个事件
            /// </summary>
            public event BoilHandler boilHandler;

      也就是在上文介绍委托入门的代码中。声明一个委托的方法上加上关键字event即可,

      完整代码如下:

    using System;
    
    namespace DelegateDemo
    {
        public class Program
        {
            public void Write1(int x, int y)
            {
                Console.WriteLine("{0}+{1}={2}", x, y, x + y);
            }
    
            public static void Write2(int x, int y)
            {
                Console.WriteLine("{0}*{1}={2}", x, y, x * y);
            }
    
            static void Main(string[] args)
            {
                GManage gm = new GManage();
                gm.delegate1 += new Program().Write1; //先给委托类型的变量赋值
                gm.delegate1 += Program.Write2; //给此委托变量再绑定一个静态方法
                gm.SayHello(1, 2);  // 将先后调用 Write1 与 Write2 方法
    
                Console.WriteLine("******解绑方法Write2后******");
                gm.delegate1 -= Program.Write2; // 委托方法解绑
                gm.SayHello(1, 2);  // 解绑后只会调用 Write1
                Console.ReadKey();
            }
        }
    
        public class GManage
        {
            /// <summary>
            /// 1、定义委托,它定义了可以代表的方法的类型
            /// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            public delegate void GreetingDelegate(int x, int y);
    
            /// <summary>
            /// 2、声明一个事件
            /// </summary>
            public event GreetingDelegate delegate1;
    
            /// <summary>
            /// 3、被调用委托的方法
            /// </summary>
            /// <param name="x"></param>
            /// <param name="y"></param>
            public void SayHello(int x,int y)
            {
                if (delegate1 != null) //如果有方法注册委托变量
                {
                    delegate1(x, y); //通过委托调用方法
                }
            }
        }
    }

      但是在实现注册的时候和委托的注册不一样,因为事件仅仅提供了 += 和 -= 两个对外的方法来实现方法的绑定和解绑,如果依旧使用 赋值符号 = ,程序即将报错。

    4、总结

      事件的本质就是委托,向外提供两个访问方法add_EventName(对应+=)和remove-EventName(对应-=)来实现方法的绑定和解绑,同时更符合面向对象的封装性和安全性。

      码字不容易,转载请注明出处。谢谢

           源码链接:https://github.com/YaoHigh/DelegateDemo

  • 相关阅读:
    极光推送消息——Alias别称方式(Andirod)
    引用极光jar包之后出现控制台日志打印不出来的问题。解决!
    极光推送消息——RegistrationID方式
    Educational Codeforces Round 79 D
    解决报错:ERROR 1005 (HY000): Can't create table 'market.orders' (errno: 150)
    ansible笔记(13):变量(二)
    ansible笔记(12):变量(一)
    zabbix4.2配置邮件+脚本报警:以QQ邮箱为例
    解决mailx发邮件报错:esmtp-server: 504 5.7.4 Unrecognized authentication type [HK2PR02CA0167.apcprd02.prod.outlook.com] "/root/dead.letter" 11/302 . . . message not sent.
    ansible笔记(11):tags的用法
  • 原文地址:https://www.cnblogs.com/highest/p/8341716.html
Copyright © 2011-2022 走看看