首页 | 互联网 | IT动态 | 网络设备 | 服务器 | IDC | 安全 | Cisco | Windows | Linux | Java | .Net | Oracle | CIW | 华为 | 专题
IT技术 | 网页设计 | 平面设计 | 电子书下载 | 教学视频 | 方案 | 数字网校 | 直播室 | 虚拟考场 | 面授培训 | 搜索 | 博客 | 沙龙 | 论坛
中国IT实验室Dotnet频道
中国IT教育
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> C# >> 文章正文

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

文章来源中国IT实验室收集整理 作者佚名 更新时间2007-10-23 保存本文保存本文 推荐给好友推荐给好友 收藏本页收藏本页

  在大家开发网络通讯软件的时候,应该都碰到过这种情况,在定义好通讯协议后要在程序中实现协议相应的功能。如:

  一个聊天程序有如下定义:

  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 }

【责编:John】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·Java入门 Tomcat的配置技巧精华专题
 ·Oracle RMAN物理备份技术详解
 ·JAVA开发利器——JBuilder知多少
 ·Hello,web2.0技术进阶专题
 ·从入门到精通 java初学者实践系列教程
 ·JAVA 与 .NET两强对垒 到底该选什么?
 ·新手必读 认识JAVA涉及的名词
 ·WEB应用集群技术专题
 ·携手未来——Ajax技术专题
 ·Oracle入门基础专题
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航