您的位置:首页 > 编程语言 > C语言/C++

在C#中实现类似C++函数指针数组的功能

2007-10-12 10:49 615 查看
[align=left]在大家开发网络通讯软件的时候,应该都碰到过这种情况,在定义好通讯协议后要在程序中实现协议相应的功能。如:[/align]
[align=left]一个聊天程序有如下定义:[/align]
[align=left]1……登陆[/align]
[align=left]2……获取好友列表[/align]
[align=left]3……修改自己资料[/align]
[align=left]…[/align]
[align=left]…[/align]
[align=left]N……退出[/align]
[align=left]每个功能由如下函数实现:[/align]
[align=left] 登陆
Void Login(UserIinfouser,Messagemsg);[/align]
获取好友列表
void GetFriendList(UserInfouser,Messagemsg);
修改自己资料
void ModifySelfInfomation(UserInfouser,Messagemsg);
[align=left]…[/align]
[align=left]…[/align]
[align=left]退出[/align]
Void Logout(UserInfouser,Messagemsg);
[align=left]那现在我们要将它一一对应起来,我们该怎么做呢?很多人也许会这样做[/align]


public static void Analyze(UserInfo user, Message message)






{


switch (msg.Class)//Class是协议的类型标志,下同






{


case 1:


Login(user, message);


break;


case 2:


GetFriendList(user, message);


break;


case 3:


ModifySelfInfomation(user, message);


break;








case N:


Logout(info, msg);


break;


default:


break;


}


}



这样做看起来没有什么不妥。但是……如果协议条数非常多或者说很复杂呢?比如说:我的协议是二级甚至是三级分类的呢?用更多的switch和case?这样显然不是一个好主意。在C++和Delphi中我们可以用函数指针数组来很好的解决这个问题。那我们在C#是不是也可以这样去解决这个问题呢?答案是肯定的。我们可以在C#中用委托数组来解决这个问题。
[align=left]让我们先定义一个委托和它的数组:[/align]
[align=left] private delegate void AnalyzerHandler(UserInfo user, Message message);[/align]
[align=left] static AnalyzerHandler[] MainAnalyzer;[/align]
[align=left]然后将函数都放到这个数组里:[/align]


MainAnalyzer = new AnalyzerHandler[]




...{


Login,


GetFriendList,


ModifySelfInfomation,





Logout


}



那我们怎么调用呢?很简单,这样就行了!


public static void Analyze (UserInfo user, Message message)




...{


if (message.Class > MainAnalyzer.Length||message.Class<0) //检查Class有没有超出有效范围


return;


MainAnalyzer[message.Class - 1] (user, message);//因为协议是从1开始而数组的下标是从0开始的,所以我们要在协议类型减去1


}



看到没有,就这么简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: