zoukankan      html  css  js  c++  java
  • 初学委托与事件

      本人最近在读《大话设计模式》这本书,由于没有C#的面向对象编程基础,所以先从附录的基础知识看起,我是在校大学生,在我们没有学习好面向对象编程的知识情况下,我们就开始了ASP.NET的学习,老师只是为了让我们实现功能而教我们,我自己深知没有理论和对面向对象的深入了解是不能做好ASP.NET的学习的,编出来的东西也是不成熟的,希望看的人以此为鉴。废话不多说了,接下来看我对学习委托与事件的理解,高手看到的话请多多指点,希望能帮助到那些学不懂委托与事件的同行理解其作用。

    基本概念:

      委托:是对函数的封装,可以当作给方法的特征指定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过。

        委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

      委托对象用关键字delegate来声明。

      public delegate void CatShoutEventHandler();

      而事件是说在发生其他类或对象关注的事情时,类或对象可通过事件通知他们。

      事件对象用event关键字声明。

      public event CatShoutEventHandler CatShout;

    接下来我们来看下书中老猫与老鼠的例子:

     CatShoutEventArgs.cs
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace ConsoleApplication1
     7 {
     8    public class CatShoutEventArgs:EventArgs//继承EventArgs
     9     {
    10         private string name;
    11 
    12         public string Name
    13         {
    14          get { return name; }
    15          set { name = value; }
    16         }
    17     }
    18 }
    Cat.cs
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace ConsoleApplication1
     7 {
     8     class Cat
     9     {
    10         private string name;
    11         public Cat(string name)
    12         {
    13             this.name = name;
    14         }
    15         //声明委托CatShoutEventHandler,此时委托所代表的方法有两个参数,object参数和CatShoutEventArgs参数
    16         public delegate void CatShoutEventHandler(object sender,CatShoutEventArgs args);
    17 
    18         public event CatShoutEventHandler CatShout;//该CatShout事件的类型为CatShoutEventHandler,即为void型且带有两个形参
    19 
    20         public void Shout()//猫叫即触发猫叫事件
    21         {
    22             Console.WriteLine("喵,我是{0}",name);
    23 
    24             if (CatShout != null)
    25             {
    26                 CatShoutEventArgs e = new CatShoutEventArgs();//声明并实例化一个CatShoutEventArgs,并给Name属性赋值为猫的名字
    27                 e.Name = this.name;
    28                 CatShout(this,e);//当事件触发时,通知所有登记过的对象,并将发送通知的自己以及需要的数据传递过去(this-->class ConsoleApplication1.Cat)
    29             }
    30         }
    31     }
    32 }
    Mouse.cs
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 namespace ConsoleApplication1
     7 {
     8     class Mouse
     9     {
    10         private string name;
    11         public Mouse(string name)
    12         {
    13             this.name = name;
    14         }
    15         public void Run(object sender, CatShoutEventArgs args)//object sender是传递事件的对象,CatShoutEventArgs args是事件,其中包含发送该事件的对象的信息
    16         {
    17             Console.WriteLine("叫声传播中,请按回车!");
    18             Console.ReadLine();
    19             Console.WriteLine("老猫{0}来了,{1}快跑!",args.Name,name);
    20         }
    21     }
    22 }
    ConsoleApplication
     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using DelegateAndEvent;
     6 
     7 namespace ConsoleApplication1
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             //实例化老猫Tom以及小老鼠Jerry和Jack
    14             Cat cat = new Cat("Tom");
    15             Mouse mouse1 = new Mouse("Jerry");
    16             Mouse mouse2 = new Mouse("Jack");
    17 
    18             //表示将Mouse的Run方法通过实例化委托Cat.CatShoutEventHandler登记到Cat的事件CatShout当中。其中"+="表示"add_CatShout"的意思。
    19             cat.CatShout += new Cat.CatShoutEventHandler(mouse1.Run); 
    20             cat.CatShout += new Cat.CatShoutEventHandler(mouse2.Run);
    21 
    22             cat.Shout();//猫叫的时候通过委托将此事件通知mouse1,mouse2执行Run;猫叫不需要任何参数,属于自然生理现象。
    23             Console.Read();
    24         }
    25     }
    26 }

    代码都以给出,里面加入了我个人的一些理解注释,若有错误的地方还请大家予以指出,非常愿意和大家进行交流。

    建议大家看完之后自己动手做一下,加深理解,调试是一个帮助理解的好方式。

  • 相关阅读:
    python note 19 异常处理
    python note 18 序列化模块
    python note 17 random、time、sys、os模块
    python note 16 re模块的使用
    python note 15 正则表达式
    python note 13 内置函数
    python note 12 生成器、推导式
    C++ int型负数除法取余问题
    Leetcode162. 寻找峰值
    Leetcode450. 删除二叉搜索树中的节点
  • 原文地址:https://www.cnblogs.com/ethanwill/p/EthanWill.html
Copyright © 2011-2022 走看看