为何从JSON加载值后Integer类型的ExeBalance未更新?
问题排查与解决方案
你遇到的核心问题是DataHandler的ExeBalance字段在赋值后未保留预期值,虽然断点显示JSON中的JBalance已被正确读取,以下是最可能的原因和解决步骤:
1. 实例不匹配(最常见)
你调试时查看的DataHandler对象和实际业务中使用的不是同一个实例。每个DataHandler实例都有独立的ExeBalance字段,比如:
// 调用LoadSave的实例 var handlerA = new DataHandler(); handlerA.LoadSave(); // 这里ExeBalance被设为5 // 但你后续访问的是另一个实例 var handlerB = new DataHandler(); Console.WriteLine(handlerB.ExeBalance); // 输出0,因为这是全新的实例
验证方式:
在LoadSave方法里添加实例哈希值输出:
public void LoadSave() { // ... 原有代码 ExeBalance = saveDataJson.JBalance; Console.WriteLine($"当前DataHandler实例哈希: {this.GetHashCode()}"); Console.WriteLine($"ExeBalance加载后的值: {ExeBalance}"); }
在你访问ExeBalance的地方也打印对应实例的哈希值,如果两者不同,说明是实例不匹配,需要确保全程使用同一个DataHandler对象。
2. 赋值后被其他代码覆盖
检查ExeBalance = saveDataJson.JBalance;执行之后,有没有其他代码修改了ExeBalance的值。比如:
- 调用了
AddBalance方法(注意你的AddBalance方法里写的是ExeBalance = ExeBalance + 1;,不管传入的amt是什么都会加1) - 其他重置ExeBalance的逻辑
验证方式:
在ExeBalance字段上设置写入断点(Visual Studio中右键字段→选择"新建断点→写入时中断"),这样每次ExeBalance被修改时都会触发断点,就能看到是哪行代码覆盖了值。
3. 代码优化建议
为了避免潜在的资源泄漏和空值问题,建议修改LoadSave方法的写法:
public void LoadSave() { string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "savedata.json"); // 使用using自动释放StreamReader资源 using (StreamReader sr = new StreamReader(filePath)) { string saveDataContent = sr.ReadToEnd(); var saveDataJson = JsonConvert.DeserializeObject<DataObject>(saveDataContent); // 增加空值检查,避免NullReferenceException if (saveDataJson != null) { ExeBalance = saveDataJson.JBalance; Console.WriteLine($"ExeBalance从savedata.json加载后的值: {ExeBalance}"); } else { Console.WriteLine("JSON反序列化失败,saveDataJson为null"); } } }
内容的提问来源于stack exchange,提问作者xJo
相关产品推荐
相关产品推荐

