C# List方法中存储的问题
遇到一个bug,抓耳挠塞好久都没有解决,有必要记录一下。 现在我使用了一个多维list。 IList<IList<int>> list = new List<IList<int>>(); 我在main函数中调用了方法函数,在方法函数中使用list.add()方法向list中添加sublist。添加代码如下: IList<int> l = new List<int>(); for(int i=0;i<10;i++) { if (条件) { l.clear(); list.Add(sublist); } } ? 一共添加了3个元素 但是最终的list中,却始终只有第三个sublist,前两个sublist存在,但是为空。这就非常奇怪,既然前两个元素存在,那么就代表list.Add(sublist)语句成功运行了,但为什么值为空呢? 我第一时间就怀疑Add方法会覆盖掉之前的值,于是我又在main函数中手动添加了两个sublist,打印出来发现,后面添加的都能成功写入,只有循环内的不可以。 这段代码是在vscode里面写的,由于不能单步调试查看局部变量,耽搁了好多时间。于是我把所有代码移到了VS2017上,开始我的单步调试(VS2017大法好!) 我一步一步调试,发现第一个sublist写入是成功的,到了第二个sublist要写入的那一刻,刷!list[0]的值变成了空! 现在问题找到了,但是我不明白问题出在哪里。 在网上终于搜到了解决方法。原来是在循环中如果使用同一个sublist,那么每次add都会把之前覆盖掉。解决办法就是不要在循环外定义sublist,而是在循环内部定义。 该方法给出的解释如下:
但是呢,我在进一步调试中发现两个问题: 1.如果去除l.clear(),程序是正常的,list值全部正常,只有添加了l.clear(),list的前几个值才会被抹去。 2.在main函数中加这样的循环(包含l.Clear()),list可以正常写入 结合该方法,我认为覆盖的原因如下: 现在申请的所有类型在.net中都被认为是引用对象,当add的时候,.net会统一重新分配内存。但是在add之前,l都指向了l的地址,查了资料就知道,clear并不清除list内存,想必是只擦除了地址,所以才会既没有报错,也没有值。 至于在main函数中为什么不会发生这种现象,我还没有比较好的思路,可能是因为list是在main中一定,不需要引用函数,也就没有list的引用过程,可能add方法就直接写入list了。水平有限,欢迎有识之士补充。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |