c# - 在类之间发送值的正确方法

标签 c# multithreading variables

我之前问过一个问题,但听起来我没有很好地解释它,所以这里是错误部分的代码 类数据包处理程序(从数据包接收信息并将它们存储在 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 处找到零,当我追踪它时我在 actualx 处找到零,但实际上我确定它们有一个值,所以我认为我在做一些愚蠢的事情

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

最佳答案

开始吧:

    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;这会产生令人讨厌的副作用(在您的原始代码中),即删除您传入的引用变量,因为这些字段最初为零。

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

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

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

关于c# - 在类之间发送值的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12387846/

相关文章:

c# - 如何让 Chrome Native Messaging 收听应用程序?

c# - 如何在 C# 中向 Allure 报告添加附件?

c# - 映射项目时 AutoMapper 中的事件

Java如何实现并行、动态划分工作?

c - C 中的外部变量及其作用域

C# .NET 4.0 应用程序适用于 Win 7 Pro 64 位,不适用于 Win 8 Pro 64 位

java - 使用我的 JFrame 同时播放音乐

java - 实现Runnable而不是扩展Thread时的不同行为

mysql - 当表名已存储为变量时选择表

bash - 不了解基本的 Bash 变量和命令分组