在C#中实现类似C++函数指针数组的功能
来源:互联网 发布:dk编程 编辑:程序博客网 时间:2024/05/21 09:49
在大家开发网络通讯软件的时候,应该都碰到过这种情况,在定义好通讯协议后要在程序中实现协议相应的功能。如:
一个聊天程序有如下定义:
1……登陆
2……获取好友列表
3……修改自己资料
…
…
N……退出
每个功能由如下函数实现:
登陆
Void Login(UserIinfouser,Messagemsg);
Void Login(UserIinfouser,Messagemsg);
获取好友列表
void GetFriendList(UserInfouser,Messagemsg);
void GetFriendList(UserInfouser,Messagemsg);
修改自己资料
void ModifySelfInfomation(UserInfouser,Messagemsg);
void ModifySelfInfomation(UserInfouser,Messagemsg);
…
…
退出
Void Logout(UserInfouser,Messagemsg);
那现在我们要将它一一对应起来,我们该怎么做呢?很多人也许会这样做
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#中用委托数组来解决这个问题。{
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;
}
}
让我们先定义一个委托和它的数组:
private delegate void AnalyzerHandler(UserInfo user, Message message);
static AnalyzerHandler[] MainAnalyzer;
然后将函数都放到这个数组里:
MainAnalyzer = new AnalyzerHandler[]
...{
Login,
GetFriendList,
ModifySelfInfomation,
…
Logout
}
...{
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
}
...{
if (message.Class > MainAnalyzer.Length||message.Class<0) //检查Class有没有超出有效范围
return;
MainAnalyzer[message.Class - 1] (user, message);//因为协议是从1开始而数组的下标是从0开始的,所以我们要在协议类型减去1
}
- 在C#中实现类似C++函数指针数组的功能
- 在c#中实现类似c/c++函数指针的功能
- java中实现类似函数指针的功能
- java中实现类似函数指针的功能
- java中实现类似函数指针的功能
- java中实现类似函数指针的功能
- 在C++中实现类似C#的字符串格式功能
- C++中实现类似C中rewind函数功能
- java实现类似函数指针功能
- 用C语言写一个数组,实现类似JAVA语言中ArrayList的功能
- SQL实现类似C#的Split()函数的功能
- 在java中实现类似c语言中goto的功能
- 指针, 指针的指针, 数组, 指针数组, 数组指针, 指针函数, 函数指针 C/C++中函数指针的含义
- 在C#中实现类似Eval这类动态求值的函数【转载】
- 用Win32实现类似MFC中Draw3dRect函数的功能
- Delphi中实现C++/Java类似静态变量的功能
- Delphi中实现C++/Java类似静态变量的功能
- Delphi中实现C++/Java类似静态变量的功能
- cross site scripting attack
- .NET Socket开发之同步Socket实现两例
- 登樱顶
- asp.net 与解压缩
- 写下一点对PETSHOP的心得
- 在C#中实现类似C++函数指针数组的功能
- Solaris命令手册
- flex系列文章:第一章. Flex概念和工具初步
- C++中堆和栈的区别,自由存储区、全局/静态存储区和常量存储区
- userData
- IDataReader 转换成DataTable
- MultiByteToWideChar和WideCharToMultiByte用法详解
- MIDlet的 生命周期
- 理查德·范曼在微软找工作