博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#委托和事件例析
阅读量:5170 次
发布时间:2019-06-13

本文共 3423 字,大约阅读时间需要 11 分钟。

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

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

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

using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{    //声明一个委托    public delegate void TimeEventHandler(object obj, TimeEventArgs args);    class Program    {        static void Main(string[] args)        {            Clock clock = new Clock(); //实例化一个时钟                        MyClassEventHandler tehc = new MyClassEventHandler(); //实例化一个观察者类            //将事件跟我们定义的观察者进行连接            //这样,clock就会知道,每当TimeChanged事件被触发,就会去通知这个观察者            //注意我们连接的时候使用的并不是直接的观察者类实例中的ShowTime()方法            //而是一个委托,并在这个委托中传递ShowTime()方法,这也是"委托"的真正意义所在:            //我有一个方法,但我委托你来帮我关联到事件,因为事件只会直接跟委托打交道,            //而不是观察者的具体某个方法            clock.TimeChanged += new TimeEventHandler(tehc.ShowTime);            clock.go();        }    }    //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 this.hour;            }        }        public int Minute {            get {                return this.minute;            }        }        public int Second {            get {                return this.second;            }        }    }    //观察者类,它有一个符合我们上面定义的"委托"的方法    //也就是void ShowTime(object obj,TimeEventArgs args)    //从这个方法的定义可以看到,我们只会关心返回类型和方法的参数,而方法名称则无所谓    class MyClassEventHandler    {        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()        {            //注意,这里的null的含义是指TimeChanged事件当前还没有观察者关注它            //如果某个观察者要关注TimeChanged事件,它必须要让这个事件知道,方法是使用操作符"+="来借助委托将其加载到事件上            TimeChanged = null;         }        //时钟开始走动,我们的目标是每秒钟触发一次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);                }            }        }    }}

C委托和事件例析 - 瑞志.net - 山林客  

 转载自:

转载于:https://www.cnblogs.com/hongfei/p/3574239.html

你可能感兴趣的文章
python检测文件的MD5值
查看>>
[COCI2009]Dvapravca
查看>>
SQL注入攻击和防御
查看>>
日志打印longging模块(控制台和文件同时输出)
查看>>
golang格式化输出---fmt包用法详解
查看>>
【转】12 TOP Command Examples in Linux
查看>>
今天起改用mac的marsedit写博
查看>>
FTP规范
查看>>
工作流图形设计器参考资料
查看>>
mysql基础以优化
查看>>
任务3,PSD切图
查看>>
8.最大滑动窗口问题
查看>>
[记录] web icon 字体
查看>>
java 利用同步工具类控制线程
查看>>
shiro 认证和授权原理
查看>>
为SIT Portal切换SIT所连接的数据库
查看>>
DDD实战进阶第一波(一):开发一般业务的大健康行业直销系统(概述)
查看>>
Python 基礎 - 函數介紹
查看>>
mysql批量执行sql文件
查看>>
安恒杯-绕过看门狗
查看>>