C# 告诉你什么是回调函数

#回调函数

什么是回调函数,在讲回调函数之前,我想先让大家了解一下函数指针变量和函数指针。

一.函数指针

函数指针就是用来存放函数地址的指针,函数指针定义如下:

#include <stdio.h>
int Add(int x,int y)
{
   return x + y;
}
int main()
{    
      int a = 1;
      int b = 2;
      //~~&函数名~~ 和直接写~~函数名~~ 都是函数的地址,没有区别
      int (*pf)(int ,int) = Add;//函数Add的地址赋给了pf,所以pf现在是函数指针变量
      int ret = (*pf)(a,b);//对函数Add的调用,其实这个写法也想当于Add(a,b)
      printf("%d\n",ret);
   return 0;
}

int (pf)(int ,int) = Add; 这条语句就是对函数指针变量的定义,星号前面的int代表函数的返回类型,星号指针变量名一定要用括号括起来,星号右边的括号用来放参数的类型的。把函数指针变量名去掉就是函数指针类型了: int ()(int ,int)。

二. 回调函数

  • 回调函数就是通过一个函数指针调用的函数

就是你把函数1的指针(地址)作为参数传递给函数2,然后这个函数1的指针被用来调用其所指向的函数,这个被用来调用的函数就是回调函数,其实也就是说函数1本来不是回调函数的,但是它被函数2调用了,然后函数1就变成回调函数了,大概是这样理解的。要注意的是回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用的,用于对该事件或条件进行响应。

一段代码让你更深刻的体会一下:

#include <stdio.h>
void print_1()//print_1被函数2调用,所以是回调函数
{
    printf("haha\n");
}
void print_0()//print_0被函数2调用,所以是回调函数
{
   printf("hehe\n");
}
void print(void (*pf)())//print函数传过来的是函数的地址,所以形参部分用函数指针类型,这时pf指向函数1
//函数2通过函数1的指针(地址)来调用其所指向的函数
{
    pf();//调用函数1
}
int main()
{
   int input = 0;
   printf("请输入1或0\n");
   scanf("%d",& input);
   if(input == 1)
   {
      print(input_1);//input_1相当于函数1,而print相当于函数2
   }
   else
   {
      print(input_0);//input_0相当于函数1,而print相当于函数2
   }
   return 0 ;
}

我想通过上面的代码,大家对回调函数也有所理解了

回调函数还可以用来写简易版的计算机(转移表)

简易版计算机源码如下:

#include <stdio.h>
int Add(int x,int y)
{
   return x + y;
}
int Sub(int x,int y)
{
   return x - y;
} 
int Mul(int x,int y)
{
   return x * y;
}
int Div(int x,int y)
{
   return x / y;
}
void menu()
{
   printf("============\n");
   printf("1.Add  2.Sub\n");
   printf("3.Mul  4.Div\n");
   printf("===0.exit===\n");
}
void Calc(int (*pf)(int x,int y))
{
     int x = 0;
     int y = 0;
     printf("请输入两个操作数\n");
     scanf("%d %d",&x,&y);
        int result = (*pf)(x,y);
        printf("%d\n",result);
}
void test1()
{
  int (*pf[5])(int,int) = {0,Add,Sub,Mul,Div};//为了提高代码的可读性,增加了0
   int input = 0;
   do
   {
     menu();
     printf("请选择你要计算的序号(1~4):\n");
     scanf("%d",&input);
     switch(input)
     {
       case 1:
         Calc(Add);
         break;
       case 2:
         Calc(Sub);
         break;
       case 3:
         Calc(Mul);
         break;
       case 4:
         Calc(Div);
         break;  
       case 0:
       printf("退出计算机\n");
         break;
       default:
        printf("序号错误,请重新选择\n");
        break;
     }
   }while(input);
}
int main()
{
   test1();
   
   return 0;
}

简易版计算机就完成了,希望大家读了这篇文章有所收获,还有不明白的或者有错误的地方可随时提出,一起加油!!

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中,回调函数是一种将方法作为参数传递给其他方法的技术。它允许您在某个操作完成后执行特定的代码。 回调函数可以通过委托(delegate)来实现。委托是一种类型,它可以存储对方法的引用,然后可以像调用普通方法一样调用委托。 要创建回调函数,首先需要声明一个委托类型,该委托定义了回调函数的签名(即参数和返回类型)。然后,可以创建一个委托实例,并将回调函数作为参数传递给其他方法。在适当的时候,其他方法可以通过调用委托来触发回调函数的执行。 以下是一个示例,演示了如何在C#中使用回调函数: ```csharp // 定义一个委托 delegate void Callback(int result); // 包含回调函数的类 class Calculator { public void Add(int a, int b, Callback callback) { int result = a + b; callback(result); // 触发回调函数的执行 } } // 回调函数 void DisplayResult(int result) { Console.WriteLine("The result is: " + result); } // 使用回调函数的示例 Calculator calculator = new Calculator(); calculator.Add(3, 4, DisplayResult); ``` 在上面的示例中,我们声明了一个名为Callback的委托类型。然后,在Calculator类中的Add方法中,我们将回调函数作为参数传递给该方法。当Add方法执行完成后,它将调用回调函数,并传递结果作为参数。最后,我们创建一个Calculator实例并调用Add方法,同时传递DisplayResult作为回调函数。 这是使用回调函数的一种常见方式,它允许您在异步操作完成后执行特定的代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值