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

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

  这两天看到c#的委托和事件这一章,书上讲得很简单直接,但是java里没得委托这个概念,在网上搜寻别人写的相关资料,感觉大多都写得太复杂了,或者就是直接讲这东西怎么声明,怎么定义,怎么实现,怎么用。看着更晕,知道怎么用,但是不知为何要用它,也不能够去很好的理解它。

下面讲讲我个人的理解,也许不太准确,如果有理解错误的地方,希望看到的网友联系本人,指正一下,互相帮助学习嘛~

委托:

  当我初看到委托的时候,我直接就想到了接口,来回忆一下接口。

  当我们要做什么事的时候,我们需要某个东西,我们要求这个东西要去做一些事,但是它要具体怎样去做我们不知道也不关心,于是我们定义一个接口,里面全是抽象方法,用于告诉别人我们要求要做这些事。然后把接口扔给别人去具体实现。我们就只管调用接口就行了。

  我理解的委托也是这样的,好比你要给自己修一座房子,你把设计图纸画好,然后扔给秘书,对他说“你去找些人来,让他们给我把房子建好。”

  是不是和接口很相似啊?

  但是如果你就只想让别人帮你做一件事就行了,而且那个人还可以做很多他自己的事,只在你要求他做的时候才需要他来做,定义一个接口是不是就显得很没有必要了呢?

  委托,是引用类型,指向方法。所以定义一个委托的时候,它看起来更像是在定义一个方法,而不同于定义一个类。

//定义一个委托public delegate int PlayMedia();//声明一个委托实例public event PlayMedia playmedia;

  用delegate关键字来创建委托。

  event关键字告诉编辑器这个委托只能够定义该委托的类调用,并且只能被其他类分别使用用+=和-=运算符来订阅或者取消订阅,当然这里也可以不要event关键字。

  委托的实现方法要和委托具有一样的返回类型和签名,但是非静态方法和静态方法都可以。

事件:

  事件其实就是委托,只不过委托可以是任何事,但是事件通常是指某些动作或者某些状态改变之类,.net中的事件还有自己的规范。

  .net中的事件处理器通常返回void类型,并且取得两个参数,第一个参数是定义委托的那个类的实例,第二个参数是一个EventArgs(事件数据的基类)的派生类对象。

 

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace ConsoleApplication1{    class Program    {        static void Main(string[] args)        {            Clock clock = new Clock();            //(实现委托)绑定事件            ClockA a = new ClockA();            a.Subscribe(clock);            ClockB b = new ClockB();            b.Subscribe(clock);            //调用clock的run方法            clock.Run();        }    }    ///     /// 事件参数类    ///     class TimeInfoEventArgs : EventArgs    {        public int Hour { get; set; }        public int Minute { get; set; }        public int Second { get; set; }        public TimeInfoEventArgs(int hour, int minute, int second)        {            this.Hour = hour;            this.Minute = minute;            this.Second = second;        }    }    ///     /// 时钟类    ///     class Clock    {        //声明一个私有变量用于存储当前的秒钟        private int second;        ///         /// 定义一个委托(秒钟改变触发事件)        ///         ///         ///         public delegate void SecondChangeHandler(object clock, TimeInfoEventArgs e);        //声明一个委托实例        public event SecondChangeHandler SecondChanged;        public void Run()        {            for (; ; )            {                //暂停100毫秒                Thread.Sleep(100);                //获取当前系统时间                System.DateTime dt = System.DateTime.Now;                //如果秒钟发生改变                if (dt.Second != second)                {                    //如果有订阅者(事件触发器)                    if (SecondChanged != null)                    {                        //通知订阅者(触发事件)                        SecondChanged(this, new TimeInfoEventArgs(dt.Hour, dt.Minute, dt.Second));                    }                    //改变存储的秒钟                    this.second = dt.Second;                }            }        }    }    class ClockA    {        //与clock类的委托绑定        public void Subscribe(Clock clock)        {            clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);        }        public void TimeHasChanged(object clock, TimeInfoEventArgs e)        {            System.Console.WriteLine("SubscribeA Current Time : {0}:{1}:{2}", e.Hour.ToString(), e.Minute.ToString(), e.Second.ToString());        }    }    class ClockB    {        public void Subscribe(Clock clock)        {            clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged);        }        public void TimeHasChanged(object clock, TimeInfoEventArgs e)        {            System.Console.WriteLine("SubscribeB Current Time: {0}:{1}:{2}", e.Hour.ToString(), e.Minute.ToString(), e.Second.ToString());        }    }}

 

 

 

 

  

 

 

转载于:https://www.cnblogs.com/huhy/p/3532323.html

你可能感兴趣的文章
Linux命令:find
查看>>
extern的作用
查看>>
Linux服务-nginx+nfs实现共享存储
查看>>
Bootstrap中关闭第二个模态框时出现的问题和解决办法
查看>>
JAVA String
查看>>
多态性和虚函数
查看>>
技术积累
查看>>
保密安全风险自评估单机版检查工具V1.0
查看>>
java 编程思想
查看>>
sql语句查询经纬度范围
查看>>
js同步访问后台资源
查看>>
函数对象
查看>>
easyUI datagrid学习笔记
查看>>
orancle的安装和配置
查看>>
viewport的故事(二)
查看>>
webservice小解
查看>>
复习javascript之类型检测
查看>>
刀哥多线程之主队列gcd-06-main_queue
查看>>
ps让文字的颜色变成图片的颜色
查看>>
CSS常见布局问题整理
查看>>