猪冰龙

导航

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

posted on 2018-08-13 10:26  猪冰龙  阅读(497)  评论(0编辑  收藏  举报