函数指针数组:在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中我们可以用函数指针数组来很好的解决这个问题。那我们在是不是也可以这样去解决这个问题呢?答案是肯定的。我们可以在中用委托数组来解决这个问题。

  让我们先定义一个委托和它的数组:

  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 }

Tags:  数组函数参数 函数数组 指针数组 函数指针数组

延伸阅读

最新评论

发表评论