c#

位置:IT落伍者 >> c# >> 浏览文章

.NET中的Event与Delegates


发布日期:2019年08月07日
 
.NET中的Event与Delegates
今天复习了一下C#中的Delegates与Event Handler整理一下思路如下

使用Delegates进行事件处理一般遵循下面的模式

我们将事件的发起者(Event Source)称为Publisher将事件的处理者(Event Handler)称为Subscriber



具体的做法用一个简单的例子来看如何进行事件的封装处理!

            

鲨鱼正在网上潜水突然他决定出门(Event)他会有什么动作呢(Event Handler)?

> 决定出门了(一个外部调用sharkMindDecideGetOut())

> 鲨鱼的脑子产生一些生物电 (一个事件激发了 OnGetOut)

> 谁来做处理丢给神经系统吧(一个delegate要负责传递指令GetOutEventHandler)

> 具体如何做当然是鲨鱼的身体啦(sharkBodyOpenDoor())

> 一个事件可能需要好几个动作处理哦所以我需要开门放下东西关门!

      

纵观一下整个事件的处理过程

            filename: Programcs              

  class Program {

    static void Main(string[] args) {

      //鲨鱼的脑袋算是一个事件发起者the Publisher

      GetOutPublisher sharkMind = new GetOutPublisher();

      //鲨鱼的身体算是一个事件处理者the Subscriber

      GetOutSubscriber sharkBody = new GetOutSubscriber();

      //建立鲨鱼的神经系统单元

      GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyOpenTheDoor);

      GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyPutDownWhat);

      GetOutEventHandler eventAction = new GetOutEventHandler(sharkBodyCloseTheDoor);

      //把鲨鱼的神经系统单元与脑子联系起来 即为将事件处理动作注册到事件委托中

      sharkMindOnGetOutHandler += eventAction;

      sharkMindOnGetOutHandler += eventAction;

      sharkMindOnGetOutHandler += eventAction;

      //外面天气不错我决定出去走走于是产生一系列的事件处理!

      sharkMindDecideGetOut();

    }

  }

      

剖析整个组成先从delegate开始为了能够封装事件我们需要先定义一个delegate

delegate void GetOutEventHandler(Object source GetOutEventArgs e);

假定你的事件处理的时候还需要传递一些参数所以我们还需定义一个EventArgs

就算出门的时候带什么东西吧~~~ ^ ^!

            filenameGetOutEventArgscs              

  class GetOutEventArgs : SystemEventArgs {

    // 出门带啥东西呢?

    private string _takeWhat;

    public GetOutEventArgs() {

      this_takeWhat = Nothing;

    }

    public GetOutEventArgs(string strTakeWhat) {

      if (strTakeWhatEquals()) {

        this_takeWhat = Nothing;

      } else {

        this_takeWhat = strTakeWhat;

      }

    }

    public string TakeWhat {

      get {

        return _takeWhat;

      }

      set {

        _takeWhat = value;

      }

    }

  }

      

对应出去我们就局限下面的响应动作了

            filenameGetOutSubscribecs              

  class GetOutSubscriber {

    public void OpenTheDoor(Object source GetOutEventArgs e) {

      // 开门

      ConsoleWriteLine(Open the door);

    }

    public void PutDownWhat(Object source GetOutEventArgs e) {

      // 放下手中的东西

      ConsoleWriteLine(Put down + eTakeWhat + );

    }

    public void CloseTheDoor(Object source GetOutEventArgs e) {

      // 关门

      ConsoleWriteLine(Close the door);

    }

  }

      

事件是如何产生的

            filenameGetOutPublishercs              

  class GetOutPublisher {

    //Publisher 说我有一个事件谁来处理?

    public event GetOutEventHandler OnGetOutHandler;

    //Publisher 产生具体的事件

    protected void OnGetOut(GetOutEventArgs e) {

      //有谁来负责处理事件吗?

      if (null != thisOnGetOutHandler) {

        //让他们来处理吧

        OnGetOutHandler(this e);

      }

    }

    //对外公开的接口调用此方法会产生事件

    public void DecideGetOut() {

      OnGetOut(new GetOutEventArgs());

    }

  }

      

当有了上面的Publisher与Subscriber后要把它们串起来需要遵循下面的过程

Step 建立Publisher Instance即Event Source

Step 建立Subscriber Instance即Event Handler

Step 建立一个Delegate来承接Subscriber的具体动作

Step 把建立的Delegate与Event进行绑定我们称之为register

Step 外部调用产生Event所有的Event Handler收到通知开始执行

具体可以参考中的主函数的步骤!

运行的结果如下:

            

Open the door

Put down Nothing

Close the door

                     

上一篇:c# 类,抽象类 抽象方法 的理解

下一篇:基于.NET平台的分层架构实战上:综述