文章收藏-FAQ 位置:电脑学习网

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

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

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

  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
   }

     [文章来源:“十万个为什么”电脑学习网]
     [网络地址:http://why100000.com]
     [版权声明:除本站部分特别声明禁止转载的专稿外,其他的文章可以自由转载,但请务必注明出处和原始作者。本站文章版权归文章原作者所有。如果本站转载的文章有版权问题请联系本站,我们会尽快予以更正。]
 

【字体:[大] [中] [小] 【加入收藏】 【发表评论】 【关闭本窗口】

Copyright © “十万个为什么”电脑学习网 2000-2007 陕ICP备06007929号
站务联系:MSN & Email:zhangking2008@gmail.com  QQ:9365822