4

我之前问过一个问题,但听起来我没有很好地解释它所以这里是错误部分类数据包处理程序的代码(从数据包接收信息并将它们存储在 x,y 并且有接受 2 的结构ushort ref 所以一旦我定义了一个对象,它就会改变我发送的变量的值)

public class PacketHandler : GUI
    {
        GameUser role;
        public PacketHandler(GameUser who)
        {
            role = who;
        }
        ushort Actualx, Actualy;
        public PacketHandler(ref ushort x ,ref ushort y)
        {
            x = Actualx; y = Actualy;
        }
        public unsafe void HandleServer(byte[] data)
        {
.
.
.
                        case 10010:
                            {
                                if (BitConverter.ToUInt16(data, 8) == 1002)
                                {
                                    Actualx = BitConverter.ToUInt16(data, 24);
                                    Actualy = BitConverter.ToUInt16(data, 26);
                                }
                                break;
                            }

这从数据包中获取值,将它们存储在actualx,实际上准备将它们提供给定义对象参数的任何ushort ref

这是其他类

public class ClientBase
{
    GameUser role2;
    public ClientBase(GameUser role)
    {
        role2 = role;
        Thread T = new Thread(HuntThread) { Name = "Hunt Thread" };
        T.Start(this);
    }
.
.
.
    public void HuntThread(object Sender)
    {
        ClientBase Client = Sender as ClientBase;
        while (true)
        {
            Monster Target = GetNextkill();
            if (Target != null)
            {
                Thread.Sleep(1000);
                ProxyParadise.Network.Packets.PacketHandler getxandy = new ProxyParadise.Network.Packets.PacketHandler(ref X, ref Y);
                ProxyParadise.Network.Packets.PacketStructure ps = new ProxyParadise.Network.Packets.PacketStructure();
.
.
.

真正的问题是我在 x 和 y 处找到零,当我追踪它时,我在实际 x 处找到零,但我确定他们得到了一个值,所以我认为我在做一些愚蠢的事情

所以总而言之,如果你不能在这段代码上帮助我或者弄清楚我的意思,那么请告诉我在使用线程时从另一个类获取值的正确方法,谢谢大家,请一些mod删除我的旧问题,我现在以更好的方式改写它

4

1 回答 1

4

开始了:

    ushort Actualx, Actualy;
    public PacketHandler(ref ushort x ,ref ushort y)
    {
        x = Actualx; y = Actualy;
    }

您正在将字段中的值(最初为零)分配给参数,而不是将参数中的值分配给字段:

    ushort Actualx, Actualy;
    public PacketHandler(ushort x , ushort y)
    {
        Actualx = x;
        Actualy = y
    }

注意我也删除了ref;这会产生令人讨厌的副作用(在您的原始代码中)擦除您传入的 by-ref 变量,因为这些字段最初为零。

但是,您不能将“对 a 的引用”存储ushort为字段。如果您需要,最好的办法是将值放到一个类中,并引用该对象:

class Foo {
    public ushort Value {get;set;}
}

那么任意数量的调用者都可以引用同一个Foo对象,因此更新一个对象就是更新所有对象。坦率地说,你PacketHandler已经可以代替这个了Foo;诀窍是让多段代码引用处理程序,并从对象.ActualX中获取它们的/ 。.ActualY

于 2012-09-12T12:17:20.213 回答