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


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

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

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

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

  • 相关阅读:
    day 13 python循环
    day 12 python开始--字符串
    day eleven 正则表达式以及shell基础学习
    day ten linux学习
    eight day linux网络基础
    设计模式
    JAVA中JDK和JRE的区别
    工作流基本概念__了解就行
    mybitis注解开发_curd操作
    Spring boot 整合SSM框架三层架构并前后台restful风格交互
  • 原文地址:https://www.cnblogs.com/myblogslh/p/6762753.html
Copyright © 2020-2023  润新知