欢迎来到天天文库
浏览记录
ID:21539281
大小:41.50 KB
页数:7页
时间:2018-10-22
《c#函数指针数组实现》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在大家开发网络通讯软件的时候,应该都碰到过这种情况,在定义好通讯后要在程序中实现相应的功能。如: 一个聊天程序有如下定义: 1……登陆 2……获取好友列表 3……修改自己资料 … … N……退出 每个功能由如下函数实现: 登陆 VoidLogin(UserIinfouser,Messagemsg); 获取好友列表 voidGetFriendList(UserInfouser,Messagemsg); 修改自己资料 voidModifySelfInfomation(UserInfouser,Messagemsg); … …
2、 退出 VoidLogout(UserInfouser,Messagemsg); 那现在我们要将它一一对应起来,我们该怎么做呢?很多人也许会这样做publicstaticvoidAnalyze(UserInfouser,Messagemessage)...{switch(msg.Class)//Class是的类型标志,下同...{case1:Login(user,message);break;case2:GetFriendList(user,message);break;case3:ModifySelfInfomation(user,messag
3、e);break;…caseN:Logout(info,msg);break;default:break;}} 这样做看起来没有什么不妥。但是……如果协议条数非常多或者说很复杂呢?比如说:我的协议是二级甚至是三级分类的呢?用更多的switch和case?这样显然不是一个好主意。在C++和Delphi中我们可以用函数指针数组来很好的解决这个问题。那我们在是不是也可以这样去解决这个问题呢?答案是肯定的。我们可以在中用委托数组来解决这个问题。 让我们先定义一个委托和它的数组: privatedelegatevoidAnalyzerHandler(Use
4、rInfouser,Messagemessage); staticAnalyzerHandler[]MainAnalyzer; 然后将函数都放到这个数组里:MainAnalyzer=newAnalyzerHandler[]...{Login,GetFriendList,ModifySelfInfomation,…Logout} 那我们怎么调用呢?很简单,这样就行了!publicstaticvoidAnalyze(UserInfouser,Messagemessage)...{if(message.Class>MainAnalyzer.Length
5、
6、
7、message.Class<0)//检查Class有没有超出有效范围return;MainAnalyzer[message.Class-1](user,message);//因为协议是从1开始而数组的下标是从0开始的,所以我们要在协议类型减去1}这个方法是为了提高Switch语句处理大量不同消息类型而改进。请参考下面:(第9点提到的函数指针数组的利用)1switch-case语句。在程序中经常会使用switch-case语句,每一个由机器语言实现的测试和跳转仅仅是为了决定下一步要做什么,就浪费了处理器时间。为了提高速度,可以把具体的情况按照它们发生
8、的相对频率排序。即把最可能发生的情况放在第一,最不可能发生的情况放在最后,这样会减少平均的代码执行时间。 2全局变量。使用全局变量比向函数传递参数更加有效率,这样做去除了函数调用前参数入栈和函数完成后参数出栈的需要。当然,使用全局变量会对程序有一些负作用。 3嵌入式系统编程应避免使用标准库例程,因为很多大的库例程设法处理所有可能的情况,所以占用了庞大的内存空间,因而应尽可能地减少使用标准库例程。(1)Inline函数 在C++中,关键字Inline可以被加入到任何函数的声明中。这个关键字请求编译器用函数内部的代码替换所有对于指出的函数的调用。这
9、样做在两个方面快于函数调用。这样做在两个方面快于函数调用:第一,省去了调用指令需要的执行时间;第二,省去了传递变元和传递过程需要的时间。但是使用这种方法在优化程序速度的同时,程序长度变大了,因此需要更多的ROM。使用这种优化在Inline函数频繁调用并且只包含几行代码的时候是最有效的。 (2)用指针代替数组 在许多种情况下,可以用指针运算代替数组索引,这样做常常能产生又快又短的代码。与数组索引相比,指针一般能使代码速度更快,占用空间更少。使用多维数组时差异更明显。下面的代码作用是相同的,但是效率不一样。 数组索引
10、 指针运算 For(;;){ p=array A=arra
此文档下载收益归作者所有