一:
问: 那每次循环都会 new 一个 A? 那内存不是会满吗? 还是说要把这个初始化对象的动作放到循环外面的写法会比较好?
- while(true)
- {
- A a = new A();
- ...
- sleep(1000)
- }
答: 对象情况下的结论
1, 内存和性能
如果一个对象实例被声明在循环内部, 那么每次执行循环体时都会为对象重新分配内存并初始化对象实例. 初始化过程并不会占用过多的时间, 但是内存分配会. 在某种情况下, 你可能无法跑到循环外部去创建对象实例. 不过, 如果可能的话, 重置并重用对象应该是更好的选择.
2, 可读性
正如我针对基本数据类型喜欢在循环外部进行变量声明一样, 只要有可能, 我就会在循环内部重置对象实例而不是重新创建一个. 当然, 如果被使用的对象实例很小, 并且循环的次数不多的话, 那么这个问题就不是那么突出了. 不过, 对这个问题还是小心一点好
3, 结论
如你所见, 到底在循环内部或外部进行声明这个问题, 对于对象而言是有差别的; 而对于基本数据类型而言, 则更多地是个人选择问题. 我的个人观点是, 如果能够在循环体中对对象实例进行重用, 那么最好采用这种方案. 从一致性角度讲, 我相信将变量在循环体外部进行声明会更好. 所以, 如果你能对对象实例进行重用, 那么你大可不必改变你的编码习惯.
二:
问: 不明白为什么可以重复实例同一个对象? 我声明一个类, 在 For 循环里重复实例十个对象, 而且对象名都是一样. 为什么不会报错哦, 明胆十个对象名都一样的.
- 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();
这样写的效果是一样的, 在循环里第一个循环就是一个新的作用域, 上一个就会被覆盖掉, 里面的对象也就自然不存在了, 你可以直白点想, 如果对象会覆盖那么循环也会覆盖, 所以就不会冲突了.
来源: http://www.bubuko.com/infodetail-2851517.html