2011-04-14 38 views
1

在询问我的第一个问题并阅读了一些提供的链接之后,我决定从开放源代码vb.net项目中将通信层移植到C#中几个月。我开始很好。现在我确实有一个问题。数据包在当前上下文中不存在

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Net.Sockets; 

namespace Eclipse_5._0 
{ 
    class PacketHandler 
    { 
     #region Packet Constructors 
     private delegate void PacketDelegate(int Index, byte[] Data); 
     private PacketDelegate[] Packet; 

     public PacketHandler() 
     { 
      Packet(Enumerations.ClientPackets.CAddChar) = HandleAddChar; 
     } 
     #endregion 

     #region Packet Methods 
     public void Handledata(int Index, byte[] Data, int MsgType) 
     { 
      ByteBuffer Buff = new ByteBuffer(); 
      Buff.WriteBytes(Data); 
      if (MsgType < 0) 
      { 
       return; 
      } 
      if (MsgType >= (int)Enumerations.ClientPackets.CQuit) 
      { 
       return; 
      } 
      Packet(MsgType).Invoke(Index, Buff.ReadBytes(Buff.Length())); 
      Buff.Dispose(); 
     } 

     public void HandleNewAccount(int Index, byte[] Data) 
     { 
      //TODO: Add New Player Account File. 
     } 

     public void HandleAddChar(int Index, byte[] Data) 
     { 
      //TODO: Add New Character to Player Account File. 
     } 
     #endregion 
    } 
} 

下面这行有错误

Packet(Enumerations.ClientPackets.CAddChar) = HandleAddChar; 

任何帮助将是巨大的。

+0

什么是数据包中的错误?另外,编译器错误说的是什么? – Jacob 2011-04-14 21:54:10

+0

约定是使用小写字母来启动变量名称。这样做会使您的代码更易于其他程序员阅读。 – unholysampler 2011-04-14 21:57:30

+0

@unholysampler感谢您的建议。我所知道的一切都是通过YouTube或网络上的教程进行自学。我想我捡到了一些坏习惯。我会尽可能地使用小写字母。 – crzyone9584 2011-04-15 00:36:43

回答

3

总的来说,这个代码看起来像一些问题,但如果你可以发布错误的细节,那么它可能会帮助我们尽快帮助你。让我们看起来在也许让你过了这个关:

Packet是一个数组,所以它看起来像你想通过指数这样的访问:

Packet[Enumerations.ClientPackets.CAddChar] = HandleAddChar; 

但数组是引用类型,所以需要被实例化 - 即使有了上面的地方,你会得到一个NullReferenceException。此外,HandleAddChar是一种方法,需要参数作为其定义的一部分;而你打算做的并不是你即使传递了适当的价值也会表达的意思。所以:

public PacketHandler() 
{ 
    Packet = new PacketDelegate[1];   
    Packet[0] = new PacketDelegate(HandleAddChar); 
} 

请注意,我已经去除了使用Enumerations.ClientPackets.CAddChar,因为它是在这种情况下毫无意义,这个想法是,数组必须被实例化,并适当的容量。最后,你不想直接在这里调用HandleAddChar,我们需要一个委托引用,所以这就是我们创建并插入到数组中的内容。

+0

感谢您的帮助。只有我想知道,直到我今晚能够回家的时候,第一个数据包不应该是0,然后handleaddchar的数据包是1吗? 我还有很多要在C#中学习。来自vb6和vb.net的猜测并没有真正的帮助。 我可能应该学习UPD,而不是尝试从vb.net翻译某些东西。我想这将是最好的路线。 – crzyone9584 2011-04-15 00:38:15

+0

@ cryzone9584:在我的例子中,数字'1'指定了数组的_length_(有多少个'PacketDelegate'可以适合它),而'0'则指定_index_(数组中的某个点,我们想要'放'的东西。)这是从零开始的索引,请参阅这里区分索引系统:http://en.wikipedia.org/wiki/Index_(computer_science) – 2011-04-15 23:25:46

+0

再次感谢您的帮助。一旦完成了我最后的3个大学项目,我会继续这样做。我会回来,再次感谢, – crzyone9584 2011-04-18 00:48:40

相关问题