空间被占用会导致无法操作里面的数据?

今天在开发中遇到了这样一个问题

简单来说,就是有一个接口,用户会进行一些操作把数据传到方法内。在方法内我会先吧服务器中的数据通过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这份空间,所以也就没了牵连?

以上全是小弟自己研究,如果有不对的地方,希望各位大神能指出来。

虽然困扰我的问题已解决,但是却不知道理解的对不对。。

原文地址:https://www.cnblogs.com/myblogslh/p/6762753.html