委托和简单事件的理解

1.室友带饭

      叫室友带饭现在是一个非常普遍的一个现象,比如某个人在认真的打着游戏,就会委托室友给他带饭回来。那我们在程序中怎么来实现这个过程呢?

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 委托1

{

      //小明

    class XiaoMing

    {

        public static void Help()

        {

            Console.WriteLine("哼!自己在寝室玩游戏不去吃饭叫我带,我欠你的呀!");

        }

    }

 

      //Program代表打游戏叫小明带饭的人

    class Program

{

     // HelpEventHandler中的EventHandler是标准命名的方式,您也可以想一个自己的名字

     // delegate声明委托的关键字,public delegate void HelpEventHandler();这就是声明一个委托。其实就是一个命令,

        public delegate void HelpEventHandler();

 

        static void Main(string[] args)

        {

            HelpEventHandler heh = new HelpEventHandler(XiaoMing.Help);

            heh();

            Console.ReadKey();

        }

    }

}//end of namespace

 

 

 

下面来看看这段代码:

public delegate void HelpEventHandler();

 

        public static void Help()

        {

            Console.WriteLine("哼!自己在寝室玩游戏不去吃饭叫我带,我欠你的呀!");

        }

从这段代码可以看出委托的返回值和参数列表,一定要和你想要绑定的方法的返回值和参数列表一样。

HelpEventHandler(XiaoMing.Help);

必须加上方法,因为委托的构造函数不为空。

 

2.不仅带饭,打游戏打渴了来一瓶矿泉水

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace 委托1

{

      //小明

    class XiaoMing

    {

        public static void HelpX()

        {

            Console.WriteLine("哼!自己在寝室玩游戏不去吃饭叫我带,我欠你的呀!");

        }

    }

      //王麻子

    class WangMaZi

    {

        public static void HelpW()

        {

            Console.WriteLine("天气太热了,来瓶矿泉水!");

        }

    }

      //打游戏的老兄

    class Program

    {

        public delegate void HelpEventHandler();

 

        static void Main(string[] args)

        {

            HelpEventHandler heh = new HelpEventHandler(XiaoMing.HelpX);

            heh += WangMaZi.HelpW;

            heh();

            Console.ReadKey();

        }

    }

}//end of namespace

 

这个例子和上一个唯一的差别就是绑定了一个方法。可以理解为委托链。就是同一个命令可以执行多个动作了。

总结:

委托的声明方式:

public delegate void 委托名();//声明委托

        public static void 方法名()//需要绑定的方法

        {

            方法体;

        }

             委托名 实例名 = new 委托名(方法名);

            实例名();

      委托其实就是一个命令。这个命令可以绑定多种响应。

 

 

下面我们来看看什么是事件

   网银想必很多童鞋都开通了吧,有的网银就有这么一个功能就是,当你在网上每消费一笔的时候就会有相应的短息提示。为什么会有这个短信提示呢,(这还用问么,当然是我声请网银的时候开通了短信提示功能的噻),对,事件就和您去开通网银到消费到收到消费提示这一过程是一个道理,我们先来理一理这个过程哈。

首先你到银行开通网银和银行谈好只要有消费就要以短信方式通知(这就相当于你到银行注册了一个消费提醒的事件,委托银行把消费信息以短信的形式发给自己)。可能你这是就会问了,银行怎么知道什么时候改发短信提醒我呢。是呀!银行怎么知道么时候发呢。哈哈您忘了开户时不是我们在银行注册了一个消费提醒事件么,不错当我们只要有消费就触发了提醒事件,这是就自动给我们发短信了,

先来看看具体的实现把;

//小明的手机

    class XiaoMingPhone

    {

        public static void Prompt()

        {

            Console.WriteLine("尊敬的用户你好,谢谢你在京东商城的消费");

        }

}

 

    //银行

    class Bank

    {

        public delegate void sendMessage();//声明一个委托

        public event sendMessage Consumption;//声明一个发信息这个事件

 

         public void isConsum()//触发发短信的信号

         {

             if (Consumption != null)//判断是否注册了消费提醒

             {

                 Consumption();

             }

         }

    }

 

    class Program

    {

        static void Main(string[] args)

        {

            //随便去一个银行,注册自己的消费提醒时事件,把自己的消费提醒委托给银行

            Bank b = new Bank();

             b.Consumption += new Bank.sendMessage(XiaoMingPhone.Prompt);//注册消费提醒事件

           

            b.isConsum();//您在网上消费了,触发发短信的信号了

            Console.ReadKey();

        }

    }

 

委托和事件的理解在于自己想一个情景把他模拟出来,现在动手自己模拟一个情景出来,这时你会发现委托原来就这么回事。大家先学会一般委托和一般自定义事件的写法,后续再献上标准事件的写法。

原文地址:https://www.cnblogs.com/gaojiangshan/p/2478130.html