zoukankan      html  css  js  c++  java
  • C# 在while循环中new的对象

    一:

      问:那每次循环都会new一个A?那内存不是会满吗?还是说要把这个初始化对象的动作放到循环外面的写法会比较好?

    1
    2
    3
    4
    5
    6
    while(true)
    {
    A a = new A();
    ...
    sleep(1000)
    }

      答:对象情况下的结论

      1、内存和性能

        如果一个对象实例被声明在循环内部,那么每次执行循环体时都会为对象重新分配内存并初始化对象实例。初始化过程并不会占用过多的时间,但是内存分配会。在某种情况下,你可能无法跑到循环外部去创建对象实例。不过,如果可能的话,重置并重用对象应该是更好的选择。
     
      2、可读性
        正如我针对基本数据类型喜欢在循环外部进行变量声明一样,只要有可能,我就会在循环内部重置对象实例而不是重新创建一个。当然,如果被使用的对象实例很小,并且循环的次数不多的话,那么这个问题就不是那么突出了。不过,对这个问题还是小心一点好
     
      3、结论
        如你所见,到底在循环内部或外部进行声明这个问题,对于对象而言是有差别的;而对于基本数据类型而言,则更多地是个人选择问题。我的个人观点是,如果能够在循环体中对对象实例进行重用,那么最好采用这种方案。从一致性角度讲,我相信将变量在循环体外部进行声明会更好。所以,如果你能对对象实例进行重用,那么你大可不必改变你的编码习惯。
     
     
    二:
     
      问:不明白为什么可以重复实例同一个对象?我声明一个类,在For循环里重复实例十个对象,而且对象名都是一样。为什么不会报错哦,明胆十个对象名都一样的。
      
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int i = 0; i < 10; i++)
    {
        Person p1 = new Person();
        p1.Name = "桂洪";
        Console.WriteLine(p1.Name);
      
      
        
    }
    Console.ReadKey();

      答:对象是有作用域的,到你下一次再进来时上一次的对象就不存在了。对象在进入作用域时产生,在超出做用域后会回收掉
    所以不会重复

    复制代码
    Person p1 = new Person();
    for (int i = 0; i < 10; i++)
    {
     
        p1.Name = "桂洪";
        Console.WriteLine(p1.Name);
    }
    Console.ReadKey();
    复制代码

    这样写的效果是一样的,在循环里第一个循环就是一个新的作用域,上一个就会被覆盖掉,里面的对象也就自然不存在了,你可以直白点想,如果对象会覆盖那么循环也会覆盖,所以就不会冲突了。

  • 相关阅读:
    python爬虫-selenium八大定位笔记
    git pull : error: cannot lock ref 'refs/remotes/origin/*' (unable to update local ref) 解决方案
    Lua table.sort()原理和使用的坑
    Unity---有关游戏物体角度的两种赋值方法这件事
    C# #if、#endif和预处理指令
    Unity 4大坐标系 和 屏幕坐标与UI坐标的转换问题
    第2次参加游戏开发比赛
    Unity Text添加空格导致换行问题的两种解决方法(还有lua的解决方法)
    MySQL是如何处理千万级数据
    PHP使用守护进程处理队列
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9976972.html
Copyright © 2011-2022 走看看