zoukankan      html  css  js  c++  java
  • 关于事件与委托的理解

    下面是别人的一段代码,拿过来分析说明下。

      1 using System;
      2 
      3 using System.Collections.Generic;
      4 
      5 using System.Text;
      6 
      7  
      8 
      9 namespace UsingEvent
     10 
     11 {
     12   //(1)定义了一个Click事件处理包。我的理解:委托就是将某种具有相同参数的方法打个包。但是就像类,具体使用还需要创建一个实例。
    13 public delegate void ClickEventHandler(object sender, EventArgs e);
    14 15 16 //一个事件首先要有事件发生对象(事件发布者),该对象有某个方法,在这个方法执行中出现了某个节点或者事件。 17 public class MyButton //创建MyBotton类----事件发布者 18 19 { 20 21 public event ClickEventHandler ClickEvent;//声明一个事件。事件就是说在某个方法过程中会出现或者说我们定义一个节点, 22 23 24 25 public void Click() //单击MyButton 26 27 { 28 29 if (ClickEvent != null) 30 31 { 32 33 Console.WriteLine("MyButton: 我被单击了"); 34 35 ClickEvent(this, null); //在我们定义的这个节点,发生了事件。需要指明参数。 36 37 } 38 39 } 40 41 } 42 43 44 //另外的一个对象(一般称为事件订阅者)。其实就是说下面这个对象里有些动作,当上面的对象发生对应的事件时,我需要自动执行这些动作。 45 public class MyForm 46 47 { 48 49 public MyButton myButton = new MyButton(); 50 //首先在这个对象中要有一个事件发布对象。 51 52 53 public MyForm() 54 55 { 56 57 58 59 //这里要说明发布者的相应事件发生后,订阅者要执行哪些动作(方法)。+=左边是发布者事件,右边是要触发的动作方法。 60      61          62 myButton.ClickEvent += new ClickEventHandler(OnClickEvent); 63 64 65 66 } 67 68 69 70 //事件发生后要执行的动作方法 71 72 73 74 void OnClickEvent(object sender, EventArgs e) 75 76 { 77 78 Console.WriteLine("MyForm: 我知道你被单击了!"); 79 80 } 81 82 } 83 84 85 86 class Program 87 88 { 89 90 static void Main(string[] args) 91 92 { 93 94 //此处下面为原来的测试方法。其实定义个Button 对象,触发下Button对象的click()方法,然后事件就发生了。只要有一个MyForm对象,就会自动触发其中的OnClickEvent方法。 95 96 MyForm form = new MyForm();//生成一个MyForm 97 98 99 100 form.myButton.Click();//单击MyForm中的鼠标,效果就出来了 101 102 } 103 104 } 105 106 }

     总结下:

    上面是比较简单的一个事件与委托的使用说明。

    个人理解:

    (1)使用事件就是希望在某件事发生时自动执行一些事情。可以是A对象的某件事发生时,B对象自动执行一些动作(方法),也可以是A对象的事件发生时,A对象自身执行一些动作(方法)。

    (2)自动执行的这些动作要统一(方法的参数要相同)。所以要先编个委托,把这些方法统一下,取名叫做XX事件处理器(Handler)。比如一般ClickEvent的事件处理包为ClickEventHander.

    分析使用:

    1个事件的编写通常由以下几个要素:

    (1)1个事件处理器(委托类):xxEventHandler.   

    (2)事件发生对象:class A。

    (3)class A中声明要使用的事件。

    (4)定义class A中的事件发生方法(代码包含事件发生)。

    (5)创建事件订阅对象: class B。

    (6)class B中定义一个A对象。

    (7)class B的构造函数中定义好A对象的事件发生时B对象要执行的方法。

    (8)class 中编写要执行的方法。(有人称之为事件处理函数)

    (9)主程序中定义A对象实例和B对象实例。然后调用A的事件方法(事件将会被引发),订阅的方法也将执行。

  • 相关阅读:
    MSDN RSS Feeds (ZT)
    不錯,今天看到日历了.
    模糊:让你的代码远离偷窥之眼
    .NET中異常發布器的開發(1)(2)(3)
    How To Query Performance Monitor Counters Using a Web Page
    可選參數的Stored Procedure範例.
    Outlook GetCurrent Folder / GetSelectedItems / GetInspectors
    微軟的MS04007补丁有严重问题啊.
    Blog,流行有理由 (zt)
    从VB.Net到VB6.0要小心,关于使用IIF和log求对数函数(串联的小知识)
  • 原文地址:https://www.cnblogs.com/haokangqi/p/9545522.html
Copyright © 2011-2022 走看看