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
相关产品推荐
相关产品推荐

