C#回调函数详解
回调和是什么
软件模块之间存在着接⼝,⽽回调是⼀种双向调⽤模式,被调⽤⽅在接⼝被调⽤时也会调⽤对⽅的接⼝。
对于⼀般的结构化语⾔,可以通过回调函数来实现回调。回调函数是⼀个函数或过程,是⼀个由调⽤⽅⾃⼰实现,供被调⽤⽅使⽤的函数。对于C和C++来说,⼀般通过函数指针实现调⽤。
对于C#来讲,声明的委托事件就像⼀个指针,通过事件变量来调⽤另外的⽅法,将该⽅法作为参数传递给另⼀个⽅法。回调函数是⼀个⼯作流的⼀部分,由⼯作流来决定函数的调⽤(回调)时机。
怎么实现?
通过声明委托来实现回调。
我们在C#编程经常会遇到事件触发流程,定义这个事件的⽅法就是回调函数。回调函数实际上就是将某种⾏为即⽅法存储下来,在需要的时候进⾏调⽤。它通过委托实现,并不⼀定是事件还是委托变量来调⽤。
先看⼀个典型C#委托声明代码:
其中object sender:表⽰触发事件的控件对象 ,sender参数⽤于传递指向事件源对象的引⽤。使⽤sender 可以查出触发事件的具体控件。
EventArgs是包含事件数据的类的基类,⽤于传递事件的细节,是⼀些事件附属的信息。public delegate void EventHandler( object sender , EventArgs e )
1using System;namespace 回调函数{    //1.声明关于事件的委托;    public delegate void AlarmEventHandler(object sender, EventArgs e);    class Dog    {        //2.声明事件;          public event AlarmEventHandler Alarm;        //3.编写引发事件的函数;        public void OnAlarm()        {            if (this.Alarm != null)            {                Console.WriteLine("\n 汪汪~~~~~~~");                this.Alarm(this, new EventArgs());  //发出警报            }        }    }    //事件接收者    class Host    {        //4.编写事件处理程序        void HostHandleAlarm(object sender, EventArgs e)        {            Console.WriteLine("主⼈: 吓死宝宝!");        }        //5.注册事件处理程序        public Host(Dog dog)        {            dog.Alarm += new AlarmEventHandler(HostHandleAlarm);        }    }    class Thief
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
writeline函数30
31
32
33
34
35
36
37
38
39
class Thief    {        void ThiefHandleAlarm(object sender, EventArgs e)        {            Console.WriteLine("⼩偷: 吓死宝宝!");        }        public Thief(Dog dog)        {            dog.Alarm += new AlarmEventHandler(ThiefHandleAlarm);        }    }    class Program    {        static void Main(string[] args)        {            Dog dog = new Dog();            Host host = new Host(dog);            Thief thief = new Thief(dog);            //当前时间,从2021年3⽉9⽇23:59:50开始计时            DateTime now = new DateTime(2021, 3, 9, 23, 59, 55);            DateTime midnight = new DateTime(2021, 3, 10, 0, 0, 0);            //等待午夜的到来            Console.WriteLine("时间⼀秒⼀秒地流逝... ");            while (now < midnight)            {                Console.WriteLine("当前时间: " + now);                System.Threading.Thread.Sleep(1000);    //程序暂停⼀秒                now = now.AddSeconds(1);                //时间增加⼀秒3940414243444546474849505152535455565758596061626364656667

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。