c#委托与事件

最近在研究委托,在此跟大家分享下。

委托时什么

    官方的讲:委托就是一种引用方法的类型,一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看做是对函数的抽象,是函数的"类",委托的实例将代表一个具体的函数。

    另一种教容易理解的解释:委托是一个类,它定义了方法的类型,使方法可以当作另一个方法的参数来进行传递。

看完定义可能是一脸懵逼,下面我们在以实例来说明:

      我在网上购买的东西到菜鸟驿站了,但是我今天要加班,无法自己去取,所有我就打电话让妹妹去帮我拿下快递,下面我们代码实现,第一版无委托

    public class Courier
    {
        private Sister sister;
        public Courier(Sister sister)
        {
            this.sister = sister;
        }
        public void Nofice()
        {
            Tike();
            sister.Take();
        }
        public void Tike()
        {
            Console.WriteLine("你的快递到了");
            Console.WriteLine("----------------");
        }


    }
    public class Sister
    {

        public void Take()
        {
            Console.WriteLine("帮我取下快递哦,妹妹");
            Console.WriteLine("好的,马上取");
        }
    }

 /// <summary>
    /// 客户端
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Courier courier = new Courier(new Sister());
            courier.Nofice();
        }
    }
//结果
你的快递到了
----------------
帮我取下快递哦,妹妹
好的,马上取
View Code

第二部,引入委托

  public delegate void TakeEventHandler(); //声明委托
    public class Courier
    {
        public event TakeEventHandler take;//定义事件,相当于委托的变量
        public void Nofice()
        {
            Tike();
            take();
        }
        public void Tike()
        {
            Console.WriteLine("你的快递到了");
            Console.WriteLine("----------------");
        }


    }
    public class Sister
    {
        public void Take()
        {
            Console.WriteLine("帮我取下快递哦,妹妹");
            Console.WriteLine("好的,马上取");
        }
    }

    /// <summary>
    /// 客户端
    /// </summary>
    class Program
    {
        static void Main(string[] args)
        {
            Courier courier = new Courier();
            courier.take += new TakeEventHandler(new Sister().Take);
            courier.Nofice();

        }
    }
View Code
View Code

这就是委托的应用,委托被人帮你完成,生活中有很多这样的例子,

在程序中引入委托解耦了Courier类与Sister类,使类直接不相互依赖,这样Sister类的改变都不会影响到Courier

下面我们来分析一下

1.声明一个为委托

   public delegate void TakeEventHandler();  定义了一个方法的类型,既返回值为void,无参类型的TakeEventHandler

2.声明一个事件:

        public event TakeEventHandler take;

3.将被委托的方法注册到事件:

      courier.take += new TakeEventHandler(new Sister().Take);//+=是注册,-=是注销

4.触发需要委托的方法:

     courier.Nofice();

5.需要委托的方法中有事件的触发

  public void Nofice()
       {
           Tike();

          take();//
       }

总结

面向对象的思想:职责分明。自己不用做的事,就委托给该干这事的人。

    通过委托,实现了Courier和Sister之间的解耦。即Courier要用Sister的方法,但没有直接调用。

    提高了代码的可扩展性,如果此时Courier还有别的事情,如要买菜,就可以把买菜委托给另一个Sister,这时,只需要再添加一个Sister类,里面写上买菜的方法,在主方法中将买菜注册到委托的事件中。就可以实现委托另一个Sister去买菜了。整个过程不会对原有程序进行任何改动。所以使用委托,提高了程序的可扩展性。

posted @ 2018-08-30 20:40  学无止境Time  阅读(247)  评论(0编辑  收藏  举报