尚未分类 性能优化/调试 水晶报表与打印 安全与加密 图形图像 文件处理基础教程 Web Services 内置对象 控件示例 正则表达式\采集 ADO.NET\数据绑定 缓存\泛型\线程 XML技术 Url重写\静态页 Enterprise企业库
返回首页
当前位置: 主页 > ASP.NET教程 > 基础教程 >

委托和事件:从猫和老鼠的故事看事件

时间:2010-07-29 10:09来源:未知 作者:admin 点击:

1.委托的含义:
      (MSDN)A delegate declaration defines a reference type that can be used to encapsulate a method with a specific signature.A delegate instance encapsulates a static or an instance method.Delegates are roughly similar to function pointers in C++;however,delegates are type-safe and secure.
      委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。
        
      我们可以这样理解委托:委托是函数的封装,它代表一“类”函数,它们都符合一定的签名:拥有相同的参数列表、返回值类型。同时,委托也可以看成是对函数的抽象,是函数的类,此时的实例代表一个具体的函数。

      2.事件的理解:
      C#使用委托模型来实现事件。事件生成者类中不用定义事件的处理方法;事件订阅者是那些希望在事件发生时得到通知的对象,它们定义将和事件委托关联的事件处理方法。当生成事件时,事件生成者通过调用事件委托“触发”事件,然后委托调用和它关联的事件处理方法。

      3.猫和老鼠的例子
      首先,我们设定一个简单场景来说明,夜深人静,屋里有老鼠蹑手蹑脚的行动,且随时提防着猫,如果听到猫叫,老鼠闻声立即逃回洞里。这个场景可以抽象为事件的几个要素:
      猫和老鼠是两个对象,猫是事件生成者对象,猫叫是一个方法,引发Cry事件;老鼠是事件订阅者对象,它提供事件处理程序Run()方法;通过委托和事件实现了老鼠对猫动静的监听,结果是老鼠听到猫叫就逃跑。下面是完整的例子:

//定义一个委托,用来关联的Cry事件处理方法
    public delegate void CryEventHandler();

    
//Cat类是事件的生成者,通过OnCry()方法引发Cry事件
    
//但Cat类并不知道谁会监听Cry事件,以及如何理Cry事件,它只是告诉环境Cry事件发生了
    
//通俗的解释是:猫叫了,但猫并不知道它的叫声对环境有什么影响
    public class Cat
    
{
        
//定义事件,表示猫叫
        public static event CryEventHandler Cry;

        
public Cat()
        
{
            Console.WriteLine(
"Cat:I'm coming.");
        }


        
public virtual void OnCry()
        
{
            Console.WriteLine(
"Cat:MiaoMiao");
            
if (Cry != null)
            
{
                Cry();
            }

        }

    }


    
//Mouse类是事件的订阅者,定义了Cry事件发生时的处理方法Run()
    
//通俗的解释是:老鼠在夜间行动时,时刻都在堤防着猫,如果听到猫叫声马上离开
    public class Mouse
    
{
        
public Mouse()
        
{
            Cat.Cry 
+= new CryEventHandler(Run);
            Console.WriteLine(
"Mouse:I go to find something,and I must always listen cat's crying.");
        }


        
public void Run()
        
{
            Console.WriteLine(
"Mouse:A cat is coming,I must go back!");
        }

    }



    
public class Demo1
    
{
        
public static void Main(string[] args)
        
{
            Mouse mouse 
= new Mouse();
            Cat cat 
= new Cat();

            cat.OnCry();

            Console.ReadLine();
        }

    }

运行后控制台输出为:
      Cat:Mouse:I go to find something,and I must always listen cat's crying.
      I'm coming. 
      Cat:MiaoMiao...
      Mouse:A cat is coming,I must go back!

 

 
      我们把猫和老鼠的场景设置复杂一点,假定有两种猫:一种是笨猫,它更本就追不上老鼠,所以老鼠即使听到它的叫声也不会逃走,对它描述为aBenCat;另一种猫就是能抓老鼠的猫了,让老鼠闻风丧胆,对它描述为smartCat。这时候老鼠听到猫叫就不会马上Run了,它要先判断来的猫是哪种猫,只有遇到的是smartCat时,老鼠才会Run。

      这就要求事件发生者除了告诉环境发生了Cry事件外,还要将一些额外的信息传递给事件的订阅者,以便订阅者根据不同情况执行不同的事件处理程序。EventArgs的类及其子类恰恰实现了这一功能。所有基于EventArgs的类都负责在发送器和接收器之间来回传递事件的信息。在大多数情况下,EventArgs类中的信息都被事件处理程序中的订阅者对象使用。但是,有时事件处理程序可以把信息添加到EventArgs类中,使之可用于发送器。下面是完整示例:

猫和老鼠的例子(2)

//假定有两种猫:一种是笨猫,它更本就追不上老鼠,所以老鼠即使听到它的叫声也不会逃走,对它描述为aBenCat;
    //另一种猫就是能抓老鼠的猫了,老鼠闻风丧胆,对它描述为smartCat

    //定义一个委托,用来关联的Cry事件处理方法
    public delegate void CryEventHandler(object sender,CryEventArgs e);

    //继承EventArgs类,负责在事件发送器和订阅者之间传递事件的信息
    public class CryEventArgs : EventArgs
    {
        private string description;

        public string Description
        {
            get { return description; }
            set { description = value; }
        }
    }

(责任编辑:admin)

[返回顶部]
相关文章【广告是网站生存发展的主要来源,请您多多支持!】
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容
  • 委托和事件:从猫和老鼠的故事看事件

    1.委托的含义: (MSDN)A delegate declaration defines a reference type that can be used ...

  • 枚举类型的用法

    14.3 枚举成员枚举类型声明的体用于定义零个或多个枚举成员,这些成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。 enum-member-de...

  • Type类的使用

    项目中要用到动态调用类的方法,去网上找了点代码,总算是弄明白了,不过传参数有点麻烦,这里差个master类,未注释的代码都经过测试了,注释的部分摘自互联网!在此...

  • C#中int、int.Parse()、int.TryParse、Convert.To

    1 (int)是一种类型转换;当我们从int类型到long,float,double,decimal类型,可以使用隐式转换,但是当我们从long类型到int类型...

  • ASP.NET根据日期获取星期方法

    protected void Page_Load(object sender, EventArgs e) { int m = System.DateTime.T...

  • 用LinkButton传递参数

    前台: asp:LinkButtonrunat= server ID= lbtnUp CommandArgument= '%#Eval(id)%' OnClic...