C# 数据包在当前上下文中不存在

C# 数据包在当前上下文中不存在,c#,variables,C#,Variables,在问了我的第一个问题并阅读了提供的一些链接后,我决定将几个月来使用的开源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 { #re

在问了我的第一个问题并阅读了提供的一些链接后,我决定将几个月来使用的开源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
是一个数组,因此您希望通过如下索引进行访问:

Packet[Enumerations.ClientPackets.CAddChar] = HandleAddChar;
但是数组是一种引用类型,因此需要实例化——这意味着即使有了上述内容,您也会得到一个
NullReferenceException
。此外,
HandleAddChar
是一种方法,需要参数作为其定义的一部分;即使传递了适当的值,你也不想表达什么。因此:

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

请注意,我已经删除了Enumerations.ClientPackets.CAddChar的使用,因为在这种上下文中它是没有意义的,我们的想法是数组必须实例化并具有适当的容量。最后,您不想在这里直接调用
HandleAddChar
,我们需要一个委托引用,这就是我们创建并插入数组的内容。

错误行中的
Packet
是什么?另外,编译器的错误说明了什么?惯例是使用小写字母来开始变量名。这样做将使您的代码更容易让其他程序员阅读。@Unholy Sampler感谢您的建议。我所知道的一切都是通过youtube或网络上的教程自学的。我想我染上了一些坏习惯。我会尽可能多地使用小写字母。谢谢你的帮助。在今晚回家之前,我唯一想知道的是,第一个数据包不应该是0,然后handleaddchar的数据包不应该是1吗?我在C#还有很多东西要学。来自vb6和vb.net的猜测并没有真正的帮助。我可能应该学习UPD,而不是尝试从vb.net翻译一些东西。我想这是最好的办法。@cryzone9584:在我的例子中,
1
的数字是指定数组的长度(可以容纳多少个
PacketDelegate
),而
0
是指定索引(数组中的某个点,我们想“放置”一些东西。)这是基于零的索引,请参阅此处了解索引系统之间的区别:再次感谢您的帮助。一旦我完成了大学的最后3个主要项目,我会继续这项工作。我会回来再次感谢你,
public PacketHandler()
{
    Packet = new PacketDelegate[1];        
    Packet[0] = new PacketDelegate(HandleAddChar);
}