在大家开发网络通讯软件的时候应该都碰到过这种情况在定义好通讯协议后要在程序中实现协议相应的功能如
一个聊天程序有如下定义
1……登陆
2……获取好友列表
3……修改自己资料
…
…
N……退出
每个功能由如下函数实现
登陆
Void Login(UserIinfouserMessagemsg)
获取好友列表
void GetFriendList(UserInfouserMessagemsg)
修改自己资料
void ModifySelfInfomation(UserInfouserMessagemsg)
…
…
退出
Void Logout(UserInfouserMessagemsg)
那现在我们要将它一一对应起来我们该怎么做呢?很多人也许会这样做
public static void Analyze(UserInfo user Message message) { switch (msgClass)//Class是协议的类型标志下同 { case : Login(user message); break; case : GetFriendList(user message); break; case : ModifySelfInfomation(user message); break; … case N: Logout(info msg); break; default: break; } }
这样做看起来没有什么不妥但是……如果协议条数非常多或者说很复杂呢?比如说我的协议是二级甚至是三级分类的呢?用更多的switch和case?这样显然不是一个好主意在C++和Delphi中我们可以用函数指针数组来很好的解决这个问题那我们在C#是不是也可以这样去解决这个问题呢?答案是肯定的我们可以在C#中用委托数组来解决这个问题
让我们先定义一个委托和它的数组
private delegate void AnalyzerHandler(UserInfo user Message message)
static AnalyzerHandler[] MainAnalyzer
然后将函数都放到这个数组里
MainAnalyzer = new AnalyzerHandler[] { Login GetFriendList ModifySelfInfomation … Logout }
那我们怎么调用呢?很简单这样就行了!
public static void Analyze (UserInfo user Message message) { if (messageClass > MainAnalyzerLength||messageClass<) //检查Class
有没有超出有效范围 return; MainAnalyzer[messageClass ] (user message);//因为协议是从开始
而数组的下标是从开始的所以我们要在协议类型减去 }