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

原创 2007年10月12日 10:49:00
在大家开发网络通讯软件的时候,应该都碰到过这种情况,在定义好通讯协议后要在程序中实现协议相应的功能。如:
一个聊天程序有如下定义:
1……登陆
2……获取好友列表
3……修改自己资料
N……退出
每个功能由如下函数实现:
 登陆
Void Login(UserIinfouser,Messagemsg);
获取好友列表
void GetFriendList(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#中用委托数组来解决这个问题。
让我们先定义一个委托和它的数组:
        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 (message.Class > MainAnalyzer.Length||message.Class<0//检查Class有没有超出有效范围
                return;
            MainAnalyzer[message.Class 
- 1] (user, message);//因为协议是从1开始而数组的下标是从0开始的,所以我们要在协议类型减去1
        }

看到没有,就这么简单。
 

简化代码,C/C++函数指针数组实现菜单系统

我们经常会遇到使用C/C++语言编写一个菜单系统的情况。在控制台窗口打印一个有好多选项的菜单,然后提示你通过输入对应的编号来完成相应的操作。 本文是关于函数指针及函数指针数组的讨论,用于简化代码,省去...
  • guodongxiaren
  • guodongxiaren
  • 2014年04月06日 20:14
  • 2083

使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现

进来复习了一下C语言指针,一直没有写过太多关于函数指针的代码,而且对回调函数的理解一直都是在理论上,基本上没有太写过关于它的代码,进来得空,写了一个小程序加深下自己对回调函数和函数指针的理解。 问...
  • Trageday
  • Trageday
  • 2014年05月30日 14:27
  • 1985

c语言结构体模拟c++对象的方法,并实现this指针

先说一下结构体模拟对象的基本思路。 1. 在结构体里定义好函数指针。 2. 在结构体外面定义好对象的方法。 3. 在结构体初始化的时候把这些方法的地址赋值给对应的函数指针。 4. 通过函数指针...
  • jsc723
  • jsc723
  • 2016年12月16日 14:17
  • 1271

利用接口与类实现类似于函数指针的功能

函数指针 java 中利用接口与类实现类似于C语言中函数指针的功能
  • Sunshine_love520
  • Sunshine_love520
  • 2017年03月23日 10:48
  • 562

java实现类似函数指针功能

如果我遍历一棵XML树,对所有节点进行统一的操作,我希望这个操作是由用户提拱的一个函数。所以想像C/C++中一样传一个函数指针当做参数,然后在我的函数中调用,怎么做到类似的功能呢? 你可以先用C风格...
  • u012160954
  • u012160954
  • 2015年11月24日 20:53
  • 288

C/C++用状态转移表联合函数指针数组实现状态机FSM

状态机在工程中使用非常的频繁,有如下常见的三种实现方法: 1. `switch-case` 实现,适合简单的状态机; 2. 二维状态表`state-event`实现,逻辑清晰,但是矩阵通常比较稀疏,而...
  • thisinnocence
  • thisinnocence
  • 2015年07月26日 16:49
  • 1492

简化代码,C/C++函数指针数组实现菜单系统

我们经常会遇到使用C/C++语言编写一个菜单系统的情况。在控制台窗口打印一个有好多选项的菜单,然后提示你通过输入对应的编号来完成相应的操作。 本文是关于函数指针及函数指针数组的讨论,用于简化代码,省去...
  • guodongxiaren
  • guodongxiaren
  • 2014年04月06日 20:14
  • 2083

函数指针数组

  • 2012年06月27日 13:14
  • 38KB
  • 下载

多线程函数指针数组.rar

  • 2009年07月09日 09:31
  • 25KB
  • 下载

C++函数指针数组的使用方法

2015-11-24 一、   缘起 什么情况下,想到将函数指针数组来的呢?是由于近期写的一个程序中,有一系列顺序化的函数,且这些函数的形式基本一致,需要对每一步的执行结果进行判断,是否执行成功,...
  • u011462318
  • u011462318
  • 2015年11月24日 20:30
  • 3811
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在C#中实现类似C++函数指针数组的功能
举报原因:
原因补充:

(最多只允许输入30个字)