C#中的委托跟事件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nineleafclover/article/details/78033628

1.委托,为了方便理解,可以将委托当作C/C++中的函数指针,可以将方法当作参数传参。

using System;

delegate int DelegateEventHandler(int i);
namespace DelegateTest
{
   class A
   {
       public static int Fun(int i)
       {
           return i*i*i;
       }
   }
   class B
   {
      public int Add(int i)
      {
          return i+i;
      }
      public int Mul(int i)
      {
          return i*i;
      } 

      static void Main(string[] args)
      {
         // 创建委托实例
         DelegateEventHandler a = new NumberChanger(Add);
         DelegateEventHandler b = new NumberChanger(Mul);
         DelegateEventHandler c = new NumberChanger(A.Fun);
         // 实例调用方法
         a(25);
         b(25);
         c(25);
         Console.WriteLine("Value of Num: {0}", a(25));
         Console.WriteLine("Value of Num: {0}", b(25));
         Console.WriteLine("Value of Num: {0}", c(25));
         Console.ReadKey();
        //委托链及创建委托的简写
        DelegateEventHandler d = Add;//效果跟上面创建方式相同
        d+=Mul;
        d+=A.Fun; 
      }
   }
}

可以理解为,有一个公司叫DelegateEventHandler,接受别人委托,这个委托必须是跟公司业务相关(有返回值跟传参类型要一样 本例中返回值跟传参都为int型)。
DelegateEventHandler这个公司接受委托后派工人帮忙解决问题(实例化对象 a b c)。之后客户需要解决这个委托时,直接找该公司派出的人就可以了(调用实例化对象 a b c)。委托链实现了一个工人能解决很多问题。

2.事件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestDemo
{
    public delegate void KillEventHandler(string name);//委托
    public delegate void KillAllEventHandler();        //委托


    public class Program
    {
        static void Main(string[] args)
        {
            people e = new people();
            worker Li1 = new worker(e);//
            friends Li2 = new friends(e);

            e.INeedFood("肉");
            e.INeedWater();
            Console.ReadKey();
        }
    }

    /*****************************事件发布器*************************************/
    public class people              
    {
        public event KillEventHandler eat;                //事件
        public event KillAllEventHandler drink;          //事件
        public void INeedFood(string food)     
        {
            Console.WriteLine("我想吃{0}!", food);
            if (eat != null)
            {
                eat(food);                                //当事件发布器这个类的实例调用此方法的时候触发相应的事件。 
            }
        }
        public void INeedWater()
        {
            Console.WriteLine("给我喝的!");
            if (drink != null)
            {
                drink();                                 //当事件发布器这个类的实例调用此方法的时候触发相应的事件。 
            }
        }
    }
    /*****************************事件订阅器1***************************************/
    public class worker
    {
        public people Li { get; set; }
        public worker(people li)
        {
            this.Li = li;
            Li.eat += eat;
            Li.drink += drink;
        }
        public void eat(string name)
        {
            Console.WriteLine("1:给他{0}吃了", name);
        }
        public void drink()
        {
            Console.WriteLine("1:给他橙汁喝");
        }
    }
    public class friends
    {
        public people Li { get; set; }
        public friends(people li)
        {
            this.Li = li;
            Li.eat += eat;

            Li.drink += drink;
        }
        public void eat(string name)
        {
            Console.WriteLine("2:我有{0},但是就不给你吃", name);
        }
        public void drink()
        {
            Console.WriteLine("2:我有白开水跟啤酒你选那一个");
        }
    } 
}

事件一个特殊的委托,只不过这个委托交给了很多人,每个人对于这个委托都有自己独特的处理方式,当事件触发的时候,订阅器接收信号之后,按照自己的方式来解决问题。

猜你喜欢

转载自blog.csdn.net/nineleafclover/article/details/78033628