2011-04-14 63 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

相關問題