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に格納し、実際には、定義しているオブジェクトパラメータにある任意のushortrefにそれらを与える準備をします。

ここに他のクラスがあります

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でゼロを見つけることです。トレースすると、actualxでゼロを見つけますが、実際には値を取得していると確信しているので、愚かなことをしていると思います。

全体として、このコードで私を助けることができないか、私が何を意味するのか理解できない場合は、スレッドを使用しながら別のクラスから値を取得する適切な方法を教えてください、みんなありがとう、いくつかの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変数をワイプするという厄介な副作用(元のコードでは)があります。

ただし、「参照」をフィールドとして保存することはできません。それが必要な場合は、値をクラスにドロップして、オブジェクトを参照するのが最善の方法です。ushort

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

その場合、任意の数の呼び出し元が同じFooオブジェクトへの参照を持つことができるため、1つを更新するとすべてが更新されます。率直に言って、あなたPacketHandlerはすでにこれの代わりに奉仕するでしょうFoo; トリックは、複数のコードがハンドラーへの参照を持ち、オブジェクトから.ActualX/を取得することです。.ActualY

于 2012-09-12T12:17:20.213 に答える