今天在开发中遇到了这样一个问题
简单来说,就是有一个接口,用户会进行一些操作把数据传到方法内。在方法内我会先吧服务器中的数据通过Id全部拿出来,然后通过循环一一匹配,把数据添加到另外一片内存中。最后,我想要把新添加的数据覆盖用户操作的数据,奇迹的事情发生了。。。
大家可以看到监视器中,list数据为count1
Data1的数据为0
在上面的代码中,我将data1的数据直接给了list
发现没有?
List的数据没有变哎,why?????
下面上代码,首先是我的Model
1 public class AModel 2 { 3 public int AId { get; set; } 4 public List<BModel> BModels { get; set; } 5 } 6 7 public class BModel 8 { 9 public int BId { get; set; } 10 public int BStatus { get; set; } 11 }
接着是我的逻辑块
1 public async static void TestTest(List<AModel> list) 2 { 3 var data1 = new List<AModel>(); 4 var model1 = new List<BModel>() 5 { 6 new BModel() 7 { 8 BId = 1, 9 BStatus = 2 10 } 11 }; 12 for (int i = 0; i < list.Count; i++) 13 { 14 var data2 = list[i].BModels; 15 for (int j = 0; j < data2.Count; j++) 16 { 17 var serviceData = model1.FirstOrDefault(c => c.BId == list[i].BModels[j].BId); 18 var bStatus = list[i].BModels[j].BStatus; 19 } 20 } 21 list = data1; 22 }
调用方法
1 var aModel = new List<AModel>() 2 { 3 new AModel() 4 { 5 AId = -1, 6 BModels = new List<BModel>() 7 { 8 new BModel() 9 { 10 BId = -2 11 }, 12 new BModel() 13 { 14 BId = -3 15 } 16 } 17 } 18 }; 19 TestTest(aModel);
实在百思不得其解的我,只能一步步的使用排除法来尝试
会不会是因为我在查询条件里使用了传输数据呢?
var serviceData = model1.FirstOrDefault(c => c.BId == list[i].BModels[j].BId);
我把这行代码进行了分解
1 var bid = list[i].BModels[j].BId; 2 var serviceData = model1.FirstOrDefault(c => c.BId == bid);
然后再来试一下
Ok了。。。
可是。。。
Why???
难道是因为不使用变量,某些内存不会进行释放?
还是。。缓存?
只有开辟出一片新的空间,供别处调用,才不会影响原有数据?
各种各样的方法在我的脑中打转
忽然一个念头冲进了我的脑中,难道是因为async?毕竟这个是4.5之后才封装出来的东西
可是,这个也不应该啊,就算是async,也不应该会影响赋值操作吧?引用类型?
先试试再说,把代码复原,删掉async
果然如此。
那么,我是不是可以理解为,当使用异步时,
var serviceData = model1.FirstOrDefault(c => c.BId == list[i].BModels[j].BId);
list[i].BModels[j].Bid 并没有被释放掉,所以导致无法赋值?或许代码还在线程中的某个地方拼命的跑着
当我使用一个变量去接收时,
var bid = list[i].BModels[j].BId;
相当于开放了一部分空间供list[i].BModels[j].Bid 来使用,所以,即使我再方法结束后,再重新给原数据赋值,因为没有用到bid这份空间,所以也就没了牵连?
以上全是小弟自己研究,如果有不对的地方,希望各位大神能指出来。
虽然困扰我的问题已解决,但是却不知道理解的对不对。。