C# 在while循環中new的對象


  

一:

  問:那每次循環都會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();

這樣寫的效果是一樣的,在循環里第一個循環就是一個新的作用域,上一個就會被覆蓋掉,里面的對象也就自然不存在了,你可以直白點想,如果對象會覆蓋那么循環也會覆蓋,所以就不會沖突了。

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM