一:
問:那每次循環都會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();
這樣寫的效果是一樣的,在循環里第一個循環就是一個新的作用域,上一個就會被覆蓋掉,里面的對象也就自然不存在了,你可以直白點想,如果對象會覆蓋那么循環也會覆蓋,所以就不會沖突了。