委托和事件

      委托和事件应用非常广泛,但对于接触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声明了事件,所以我们注册事件时不能使用“=”。

 

 

 

 

 

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

posted @ 2015-12-17 20:15  剑弑  阅读(229)  评论(0编辑  收藏  举报