C语言函数指针与 c#委托和事件对比
C语言:
函数指针可以节省部分代码量,写类似具有多态的函数,比如要比较最大值,如果不用函数指针就只能写比较某一类型比如int类型的max函数,这个max无法比较string的大小。函数指针的意义就不多说了。
执行结果:
C语言代码:
1 #include <stdio.h> 2 void subfun(char (*pstr)[]) 3 { 4 printf("my name is %s",*pstr); 5 } 6 ////其中fpsubfun是指针的类型,可以当int这种关键字使用,以后可以用 fpsubfun pf;来定义函数指针,这个指针便指向 void (char (*p)[])这种签名的函数。 7 typedef void(*fpsubfun)(char (*p)[]);//typedef的几种用法:https://blog.csdn.net/drdairen/article/details/51848647 8 void call_subfun(fpsubfun pf)//用函数指针接受传过来的函数 9 { 10 char str[] = { "zhubinglong. \n" }; 11 char(* pstr)[] = &str; 12 pf(pstr); 13 } 14 int main() 15 { 16 call_subfun(subfun);//函数调用函数,方式是subfun以参数的方式传递给函数指针,接受这个subfun函数的指针必须与subfun的函数签名(参数和返回值)相同; 17 return 0; 18 }
下面类比c#的委托和事件:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 namespace ConsoleApplication1c_委托和事件 6 { 7 //定义委托,与类同一个等级,相当于c语言中定义函数指针类型语句:typedef void(*fpsubfun)(char (*p)[]); 8 //其中fpsubfun是指针的类型,可以当int这种关键字使用,以后可以用 fpsubfun pf;来定义函数指针,这个指针便指向 void (char (*p)[])这种签名的函数。 9 public delegate void fpsubfunEventHandler(string str); 10 11 class MyProgram 12 { 13 public static event fpsubfunEventHandler fpsubfun;//定义事件:与函数同一个等级,相当于fpsubfun pf 14 static void Main(string[] args) 15 { 16 MyProgram.fpsubfun += subfun;//订阅事件,相当于C语言中函数指针fp指向了某一函数,call_subfun(subfun);--->void call_subfun(fpsubfun pf){}这一传递过程 17 MyProgram.fpsubfun("zhubinglong");//事件发出,但由谁执行我不关心,我只是发出事件;其实有订阅事件语句的函数执行。相当于C语言中用指向某函数的指针调用这一函数,相当于c语言中 pf(pstr); 18 } 19 public static void subfun(string str) 20 { 21 Console.WriteLine("my name is {0}",str); 22 } 23 // 24 } 25 }
想详细的看具体在c#中怎么用委托和事件,可以参考:https://www.cnblogs.com/yinqixin/p/5056307.html