在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
}
看到没有,就这么简单。
[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
}
看到没有,就这么简单。
相关文章推荐
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
- C#: 类似BackGroundWorker功能的实现
- C# DataGridView中实现类似ComboBox可编辑的下拉框功能
- Java中没有C#的out关键字,但可以通过数组实现类似的效果
- 用C语言写一个数组,实现类似JAVA语言中ArrayList的功能
- C#类似QQ窗体抖动功能的实现
- js 模拟实现类似c#下的hashtable的简单功能代码
- C#+AE实现类似IDentify功能及对高亮显示相关接口的总结
- 【转载】用C#语言实现类似QQ的截图功能
- SQL实现类似C#的Split()函数的功能
- 用C#代码实现类似QQ窗体的“上、左、右”停靠功能【转】
- C#实现QQ类似的截屏功能
- C#函数如何实现类似多个返回值的功能
- C#+AE实现类似IDentify功能及对高亮显示相关接口的总结
- c#的动态按钮数组的添加与功能实现
- 用C#实现截图功能(类似QQ截图)
- JAVA--实现类似C#输入功能的Console类
- Android实现类似C#ComBox功能用AutoCompleteTextView实现