C#回调函数的简单讲解与应用例子(最简单讲解,大神绕道)

本博客一直以来的宗旨就是:用最简单的方式讲清楚不复杂的问题。

因为本人也很菜所以也没法讲太复杂HHHHHH......

所以如果哪天某个大神看到了觉得讲的有问题欢迎指出。

话不多说进入正题。。

——————————————————————————————————————

这篇文章的目的就是讲清楚C#回调函数是什么,以及什么时候使用。

直接拿例子来讲算了- -

  1. using System;
  2.  
  3. namespace CallBackTest
  4. {
  5. class Program //用户层,执行输入等操作
  6. {
  7. static void Main(string[] args)
  8. {
  9.  
  10. CalculateClass cc = new CalculateClass();
  11. FunctionClass fc = new FunctionClass();
  12.  
  13. int result1 = cc.PrintAndCalculate(2, 3, fc.GetSum);
  14. Console.WriteLine("调用了开发人员的加法函数,处理后返回结果:" + result1);
  15.  
  16. int result2 = cc.PrintAndCalculate(2, 3, fc.GetMulti);
  17. Console.WriteLine("调用了开发人员的乘法函数,处理后返回结果:" + result2);
  18.  
  19. Console.ReadKey();
  20. }
  21.  
  22.  
  23. }
  24.  
  25. class FunctionClass //开发层处理,开发人员编写具体的计算方法
  26. {
  27. public int GetSum(int a, int b)
  28. {
  29. return (a + b);
  30. }
  31. public int GetMulti(int a, int b)
  32. {
  33. return (a * b);
  34. }
  35. }
  36.  
  37. #region 实际开发中,下面这个类会封装起来,只提供函数接口。相当于系统底层
  38. class CalculateClass
  39. {
  40. public delegate int SomeCalculateWay(int num1, int num2);
  41.  
  42. //将传入参数在系统底层进行某种处理,具体计算方法由开发者开发,函数仅提供执行计算方法后的返回值
  43. public int PrintAndCalculate(int num1 , int num2 , SomeCalculateWay cal)
  44. {
  45. Console.WriteLine("系统底层处理:" + num1);
  46. Console.WriteLine("系统底层处理:" + num2);
  47. return cal(num1, num2);//调用传入函数的一个引用
  48. }
  49. //可以封装更多的业务逻辑方法
  50.  
  51. }
  52. #endregion
  53.  
  54. }

直接复制进控制台项目即可运行。

运行结果:

感觉例子还是比较直白的。例子能看懂就不用看下面的了。

下面详细解释一下(包含一些关于封装的意义):

1、中间的FunctionClass中的GetSum()和GetMulti()两个函数称为回调函数。可以看到整个程序中并没有哪个地方通过类似GetSum(1,2)这种形式调用了该函数,只有将其当作另一个函数的参数来进行调用。如cc.PrintAndCalculate(2,
3, fc.GetSum)。

下面是百度百科的定义:

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

有的同学可能会问了,那为什么不直接写int result1 = GetSum(1,2)呢?岂不是更方便?这就涉及到封装和实际开发的问题了 ↓

_________________________________

我们假想一下这个情况:

我们的项目是个核武器控制器,假设并没有涉及到回调函数。当用户输入1,2并且执行GetSum(1,2)的时候,这个工程会把1,2写进核武器的发射系数里,比如方向方位等,然后GetSum求得发射距离,之后进行发射。

看起来也很完美?没什么瑕疵?

不,有没有想过万一哪天操作失误了呢。万一哪天某个人输入错了,把-1,-2输入进去了,现在倒好,本来要打到外面去的导弹打到自己家了,这个损失就是不可估量的了。

你可能又会说了,那让程序员在客户端(用户端)判断一下呗,比如加一句 if(a>0 && b>0) getsum(a,b);

那你有没想过,万一哪天这个程序员的代码写错了一行呢?或者派了一个像我一样很菜的实习生过来写代码?岂不是又要把导弹打到自己家了吗hhhhhhhh。所以,在实际大型应用中,“把参数写进核武器”

这个操作的代码并不是所有人都能接触到的,只有项目里最核心的工程师经过反复测验才能应用上去的,而且要对这些参数甚至是结果进行必要的判断,并且如果要修改代码也是会经过慎重考量的,因为你一改,相当于整个项目底层都进行了改变,所有调用你函数的人执行效果也都会发生改变。

以上就是封装的意义。(当然封装还有其他意义这里就不赘述了)

______________________________________________________________________

2、在实际开发中,CalculateClass这个类会被封装起来,比如提供一个dll文件给你,你通过引用dll来调用里面的参数或者函数。一般项目里的大佬/主程都会把这些底层的东西打包进dll,防止误操作使得系统崩溃,也让外界不能轻易访问底层的东西。

在这个类中,public
delegate int SomeCalculateWay(int num1, int num2);
这一语句声明了一个委托,后面定义的SomeCalculateWay
cal就代表着cal是一个带有两个int参数的函数。关于委托的例子和应用这里也不多讲了,能理解就好。

3、在用户层的main函数里,用户可以通过输入参数2,3,然后获取一个开发人员的方法比如getsum,然后把这些作为参数,调用底层的函数,再得到想要的效果。这样子不管是用户还是开发人员误操作了,最后都会被底层的函数给判断出来,从而不会执行错误的结果而造成损失。

说了这么多,感觉讲的还是挺清楚的,适合新手看看。。

如果哪里有错误也希望大家指出,谢谢。。

原文地址:https://www.cnblogs.com/bdqczhl/p/9545416.html

时间: 2024-09-29 10:43:47

C#回调函数的简单讲解与应用例子(最简单讲解,大神绕道)的相关文章

Java 回调函数

回调函数 我对回调函数的理解 假设: 我的车在家里,现在已经坏了,我打电话给万能的维修工,我告诉他,嘿!哥来帮我修一下我的车吧!但是,维修工告诉我没有现在空闲,等有空闲了我可以上门服务!我告诉维修工如果你有空了那么你就直接来我家给我修理吧. 换成程序而言: 如果我想让一个类,调用我自己声明的方法,那么我需要一个一个回调接口来让我自己的类去实现它.通过这样来实现回调函数.回调函数就好像是C#中的委托.Java中并没有类似的机制.可以利用接口来实现回调. 下面是一个小的Demo: 下面是一个简单的类

【JavaScript】理解与使用Javascript中的回调函数

在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因为函数是第一类对象,我们可以在Javascript使用回调函数.在下面的文章中,我们将学到关于回调函数的方方面面.回调函数可能是在Javascript中使用最多的函数式编程技巧,虽然在字面上看起来它们一直一小段Javascript或者jQuery代码,但是对于许多开发者来说它任然是一个谜.在阅读本文

理解与使用Javascript中的回调函数

在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因为函数是第一类对象,我们可以在Javascript使用回调函数.在下面的文章中,我们将学到关于回调函数的方方面面.回调函数可能是在 Javascript中使用最多的函数式编程技巧,虽然在字面上看起来它们一直一小段Javascript或者jQuery代码,但是对于许多开发者来说 它任然是一个谜.在阅读

Cocos2d-x 3.0中 物理碰撞检測中onContactBegin回调函数不响应问题

好吧,事实上这篇也是暂时冒出来的,近期朋友要做个物理游戏,曾经做物理还是用box2d,呃.确实要花些功夫才干搞懂当中的精髓,可是听讲这套引擎又一次封装了一次.要easy非常多,所以就简单尝试了一下,感觉确实要简单不少,只是在这当中还是遇到了些问题,首先就来说说onContactBegin这个回调函数响应问题. 先说说情况.简单做了一个打砖块的游戏.前面一切都非常顺利,仅仅是做到碰撞检測的时候,发现回调函数弄死都不调用.開始我以为函数写错了,后来查了api.testCpp都没有错,在3.0的api

Cocos2d-x 3.0中 物理碰撞检测中onContactBegin回调函数不响应问题

好吧,其实这篇也是临时冒出来的,最近朋友要做个物理游戏,以前做物理还是用box2d,呃,确实要花些功夫才能搞懂其中的精髓,但是听讲这套引擎重新封装了一次,要容易很多,所以就简单尝试了一下,感觉确实要简单不少,不过在这其中还是遇到了些问题,首先就来说说onContactBegin这个回调函数响应问题. 先说说情况,简单做了一个打砖块的游戏,前面一切都很顺利,只是做到碰撞检测的时候,发现回调函数弄死都不调用.开始我以为函数写错了,后来查了api,testCpp都没有错,在3.0的api中,没有关于P

第36篇 多进程的数据共享,进程池的回调函数,线程 什么是GIL锁,Threading模块记

内容概览: 进程 数据共享 进程池--回调函数 线程 线程的基础理论 什么是线程? 线程与进程的关系 GIL锁 线程的开启: Threading模块1,用多进程开启socket创建聊天 server端写了input函数会报错?因为服务器是高速运行的,自动化的为来访问的客户端提供服务, 不可能停下来等待管理员的输入,然后发送给客户.这就失去了自动化的意义. 2,进程池Pool()方法创建的进程,map()方法是否有返回值? p.map()得到的是迭代对象 import time from mult

JavaScript系列之回调函数callback

JavaScript回调函数的使用是很常见的,引用官方回调函数的定义: A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. 解释得很明确,回调函数就是作为参数传递给另一个函数并在其父函数完成后执行的函数. 听起来似乎有点不好理解,所以还是举例进行说明,介绍回调函数之前先简单说明一下同步和

python全栈开发基础【第二十二篇】进程池和回调函数

一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实上Manager的功能远不止于此. 命令就是一个程序,按回车就会执行(这个只是在windows情况下) tasklist 查看进程 tasklist | findstr pycharm #(findstr是进行过滤的),|就是管道(tasklist执行的内容就放到管道里面了, 管道后面的findst

一个简单的java回调函数的实现

回调函数 回调函数涉及的3个函数 登记回调函数 回调函数 响应回调函数 简单的解释 你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货.在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件.回答完毕.来自知乎点击打开链接 代码的实现 首先有一个接口 interface CallB