You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#对象丢失引用变为空值问题求助

解决Game类中World引用为空的问题

兄弟,我瞅你这情况十有八九是踩了引用传递的坑,结合你说的场景,给你捋几个最可能的原因和解决办法:

1. 别在DataManager里重新赋值World对象

你是不是在DataManager的填充方法里干了这事:

public void FillWorld(World world)
{
    world = new World(); // 这里就是坑!
    // 然后开始给world塞XML数据
}

这种写法里,你修改的只是方法里的局部变量引用,Game类里原来的world还是空的!因为C#里引用类型作为参数传递时,默认是传值(传的是引用的副本),你重新赋值局部变量后,就和原来的引用没关系了。

正确的做法是直接修改传入的World对象的属性:

public void FillWorld(World world)
{
    // 直接给已有world的属性赋值,比如:
    world.Rooms = LoadRoomsFromXml();
    world.PlayerStartPosition = LoadStartPosFromXml();
    // 其他属性依次填充...
}

要是你必须新建World实例,那让方法返回这个实例,在Game类里接收:

public World CreateAndFillWorld()
{
    World world = new World();
    // 填充XML数据
    return world;
}

// Game类里这么用:
this.world = dataManager.CreateAndFillWorld();

2. 检查是不是异步加载的时序问题

如果你的XML加载是异步操作(比如用了async/await),那有可能DataManager还没加载完数据,Game类就急着去访问world了,这时候world自然是空的。

这种情况要确保Game类等待加载完成后再使用world,比如:

// Game类里调用的时候
await dataManager.FillWorldAsync(this.world);
// 之后再去操作world

3. 确认是不是实例搞混了

虽然两个类在同一命名空间,但要检查Game类里的world实例和传给DataManager的是不是同一个对象,别不小心new了多个World实例,比如Game里声明了private World world;,但传参的时候却传了new World(),那填充的就不是Game类里的那个world了。

内容的提问来源于stack exchange,提问作者user3597549

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:51:29