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

          委托和事件应用非常广泛,但对于接触C#不长的人来说并不容易。他就像一道门槛,过了这个槛的人觉得真的是太容易了;但很多人过这到槛都只能过一半。今天我就跟大家来分享下我对于委托和事件的看法。

         声明一个委托很简单只要加上delegate关键字就可以声明委托,下面是无参委托和有参委托的声明

          public delegate void FrisDelegate();

          public delegate void ToDelegate(int a ,int b);

          虽然声明一个委托很简单,但是我们要怎么去用他呢?下面我们先来看一个例子:

         public class A

        {

                public void GetDelegate(EntrustDelegate  buyEgg)

               {

                      if(buyEgg!=null)

                           buyEgg();

               }

         }

         public class B

         {

                 public static void buyEggA()

                 {

                      Console.WriteLine("A去买");

                 }

                 public static void buyEggB()

                 {

                        Console.WriteLine("B去买");

                 }

         }

         public delegate void EntrustDelegate();

         class D

         {

               static void Main(string []args)

               {

                     EntrustDelegate a1,b2;

                      A a=new A();

                      a1=B.buyEggA;

                      b2=B.buyEggB;

                      a.GetDelegate(a1); 

                      a.GetDelegate(b2);

                      Console.Read();

               } 

         }

         输出结果:

         A去买

         B去买

        以上就是委托的用法,但我们还能不能优化呢?因为每绑定一个方法就要声明一个事件这样会很麻烦。

        答案是可以的,下面我们就来看看优化后的代码:

        public class A
       {
               public delegate void EntrustDelegate();
               public event EntrustDelegate buyEgg;
               public void GetDelegate()
              {
                    if (buyEgg != null)
                         buyEgg();
              }

        }

        public class B
       {
           public static void buyEggA()
          {
              Console.WriteLine("A去买");
           }

           public static void buyEggB()
         {
              Console.WriteLine("B去买");
         }
       }

        class D
       {
          static void Main(string[] args)
         {
             A a = new A();
             B b = new B();
             a.buyEgg += B.buyEggA;
             a.buyEgg += B.buyEggB;
             a.GetDelegate();

            a.buyEgg -= B.buyEggB;

             a.GetDelegate();
             Console.Read();
         }

       }

    输出结果:

         A去买

         B去买

         A去买

       优化后的代码确实简结多了,但是“+=”有什么作用为什么不是用“=”呢?"-="又是干嘛?

       “+=”是给事件注册方法,而“-=”是取消注册;而之所以不用“=”是因为我们把委托放在A类声明中用event声明了事件,所以我们注册事件时不能使用“=”。

    如写的不对之处,欢迎指正!!!!

  • 相关阅读:
    Conda 使用笔记
    个人日志笔记软件比较
    CMD 命令笔记
    Joplin 资源汇总
    【NAS】Hexo+Github 搭建博客&基础配置
    【NAS】群晖 WordPress 使用记录
    哈工大计组mooc 第四章 中 测试
    下列软件包有未满足的依赖关系:
    安装ubuntu用Ultraiso制作引导盘便捷启动提示:找到多余一个分区
    ros安装caffe anaconda2之后roscore无法执行
  • 原文地址:https://www.cnblogs.com/ljhboke/p/5055191.html
Copyright © 2011-2022 走看看