讨鬼传极特殊技怎么用:C#委托和事件例析 - 山林客的日志 - 网易博客

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 12:13:27

C#委托和事件例析

C# 2009-01-11 22:56:04 阅读2454 评论3   字号: 订阅

ah_bill是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。

委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。

下面是最近写的一个例子,相信能够加深大家对委托和事件的理解。

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication3
{
    public delegate void TimeEventHandler(object obj, TimeEventArgs  args); //定义一个委托,委托其实就是“方法模板”,就好像“类”是“对象”的模板一样。如果某个类想在事件触发的时候收到通知,它必须有一个符合这种格式的方法,在这个例子中,就是:返回类型为void,参数类型为object、TimeEventArgs。

//TimeEventArgs是我们自己定义的一个类,用于保存事件中的参数。这里我们分别保存时间的时分秒。

    public class TimeEventArgs:EventArgs { 
        private int hour;
        private int minute;
        private int second;
        public TimeEventArgs(int hour, int minute, int second)
        {
            this.hour = hour;
            this.minute = minute;
            this.second = second;
        }
        public int Hour
        {
            get
            {
                return hour;
            }
        }
        public int Minute
        {
            get
            {
                return minute;
            }
        }
        public int Second
        {
            get
            {
                return second;
            }
        }
    }

 //这是一个观察者类,它有一个符合我们上面定义的“委托”的方法,也就是void ShowTime(object obj, TimeEventArgs args),从这个方法的定义可以看到,我们只会关心返回类型和方法的参数,而方法名称则无所谓。

   class MyTimeEventHandlerClass
    {
        public void ShowTime(object obj, TimeEventArgs args)
        {
            Console.WriteLine("现在的时间是:"+args.Hour+":"+args.Minute+":"+args.Second);
        }
    }

//时钟类
    class Clock
    {

//我们在这个类中定义了一个“TimeChanged”事件,注意其前面有两个关键字“event”和“TimeEventHandler”,其中event表示这是一个事件,而不是方法或属性;TimeEventHandler则指出,谁要监听TimeChanged事件,它就必须有一个符合TimeEventHandler(委托)的方法。
        public event TimeEventHandler TimeChanged;
        public Clock()
        {
            TimeChanged = null; //注意,这里的null的含义是指TimeChanged事件当前还没有观察者关注它,如果某个观察者要关注TimeChanged事件,它必须要让这个事件知道,方法是使用操作符“+=”来借助委托将其加载到事件上。
        }

//时钟开始走动,我们的目标是每秒钟触发一次TimeChanged事件
        public void go()
        {
            DateTime initi = DateTime.Now;
            int h1 = initi.Hour;
            int m1 = initi.Minute;
            int s1 = initi.Second;
            while (true)
            {
                DateTime now = DateTime.Now;
                int h2 = now.Hour;
                int m2 = now.Minute;
                int s2 = now.Second;
                if (s2!=s1)
                {
                    h1 = h2;
                    m1 = m2;
                    s1 = s2;

//首先建立一个TimeEventArgs对象来保存相关参数,这里是时分秒。
                    TimeEventArgs args = new TimeEventArgs(h2,m2, s2);

//注意这种写法,这一句是用来触发事件,事件不是类,所以不用使用“new”关键字,而且我们看到,这里TimeChanged的两个参数跟我们的委托(TimeEventHandler)是一致的,其中第一个参数是触发这个事件的对象,我们这里使用的是一个时钟实例(this)。

                    TimeChanged(this, args);
                }
            }
        }
    }

 


    class Program
    {

        static void Main(string[] args)
        {
            Clock clock = new Clock(); //实例化一个时钟
            MyTimeEventHandlerClass tehc = new MyTimeEventHandlerClass(); //实例化一个观察者类

//将事件跟我们定义的观察者进行连接,这样,clock就会知道,每当TimeChanged事件被触发,就会去通知这个观察者,注意我们连接的时候使用的并不是直接的观察者类实例中的ShowTime()方法,而是一个委托,并在这个委托中传递ShowTime()方法,这也是“委托”的真正意义所在——我有一个方法,但我委托你来帮我关联到事件,因为事件只会直接跟委托打交道,而不是观察者的具体某个方法。
            clock.TimeChanged+=new TimeEventHandler(tehc.ShowTime);
            clock.go();
        }
    }


}

 

C#委托和事件例析 - 山林客的日志 - 网易博客 齐鲁证券关于提供“隔日委托”的公告 - 风絮飘残已化萍泥莲刚的日志 - 网易博客 读博日记(C#常用开源类库收集) - 静林的日志 - 网易博客 C#中大文件快速拷贝方法 - 云中飞龙的日志 - 网易博客 优美清雅 如听仙乐 淡远虚静 如入山林 之《空山寂寂》纯音乐 - 魅儿的日志 - 网易博客 委托(C#2008) 北大超短裙事件! - 泥鳅的日志 - 网易博客 新聞熱點事件之後 - 宮鈴的日志 - 网易博客 C#多线程-不同线程之间通过事件委托封送调用方法 博客代码和素材大全 - ajun2008的日志 - 网易博客. 博客代码和素材大全 - ajun2008的日志 - 网易博客 事件的委托处理,为每个格子绑定click事件 归纳法和演绎法的原型 - 安重纪的日志 - 网易博客 全球令人震惊的集体死亡事件 - 真光的日志 - 网易博客 盘点全球最壮观的哄抢事件! - 真光的日志 - 网易博客 史上最轰动的泄密事件[组图] - 真光的日志 - 网易博客 蹿红网络的恶搞事件 - 真光的日志 - 网易博客 全球无可奈何的杯具事件(组图) - 蔷薇的日志 - 网易博客 “健美猪”事件的反向治理 - 刘洪波的日志 - 网易博客 [社论]“染色馒头事件”的深层追问 - 黄波的日志 - 网易博客 “华南虎”事件主犯周正龙在狱中的生活(组图) - wlpzpp715的日志 - 网易博客 中国古代最早的一起风水事件 - 倪方六的日志 - 网易博客 JQuery触发Checkbox的change事件 - 维子的日志 - 网易博客 哪些是生活中常见的负性压力事件 - 彩云心理咨询的日志 - 网易博客