前几天加班时处理一个问题,问题的表象就是跟踪断点看的数据已经更新到了子结构上,但是其父级里缺没有更新,该结构是一个大的json结构转化过来的,层级较深,且有嵌套关系,跟踪处理了半个小时都没发现有什么问题,最终在同事的提醒中突然醒悟,原来是ToList的问题。
当时是在大结构中通过where查询到了子结构的列表,where后面紧跟着的就是ToList操作,此时子结构实际已经和大结构是脱离开了,分别指向了不同的存储地址,所以改动子结构时,父级是不会同步更改的。
原来的代码
var nodes =convertobj.body.dataNode.groups.First().childNodes.Where(a => a.type == 1).ToList();
foreach(var node in nodes){
....更改node里面子对象中的一个写信息
}
跟踪时发现nodes里面已经更改了,但是convertobj里面是没有变化的,根本原因就是ToList()实际已经是地址引用了,如果要实现改nodes的同时,convertobj也要改,那么就不能ToList。
var nodes =convertobj.body.dataNode.groups.First().childNodes.Where(a => a.type == 1);
foreach(var node in nodes){
....更改node里面子对象中的一个写信息
}