C# 回调函数详解

回调和回调函数是什么

软件模块之间存在着接口,而回调是一种双向调用模式,被调用方在接口被调用时也会调用对方的接口。
对于一般的结构化语言,可以通过回调函数来实现回调。回调函数是一个函数或过程,是一个由调用方自己实现,供被调用方使用的函数。
对于C和C++来说,一般通过函数指针实现调用。
对于C#来讲,声明的委托事件就像一个指针,通过事件变量来调用另外的方法,将该方法作为参数传递给另一个方法。回调函数是一个工作流的一部分,由工作流来决定函数的调用(回调)时机。

怎么实现?

通过声明委托来实现回调。
我们在C#编程经常会遇到事件触发流程,定义这个事件的方法就是回调函数。回调函数实际上就是将某种行为即方法存储下来,在需要的时候进行调用。它通过委托实现,并不一定是事件还是委托变量来调用。
先看一个典型C#委托声明代码:

public delegate void EventHandler( object sender , EventArgs e )

其中object sender:表示触发事件的控件对象 ,sender参数用于传递指向事件源对象的引用。使用sender 可以查出触发事件的具体控件。
EventArgs是包含事件数据的类的基类,用于传递事件的细节,是一些事件附属的信息。

using 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
    {
        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);                //时间增加一秒
            }
            Console.WriteLine("\n月黑风高的午夜: " + now);
            Console.WriteLine("小偷悄悄地摸进了女主人的屋内... ");
            dog.OnAlarm();
            Console.ReadLine();
        }
    }
}

参考文章:
理解C#回调函数
C# (事件触发)回调函数,完美处理各类疑难杂症!

  • 17
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值