一:性能
問:那每次循環都會new一個A?那內存不是會滿嗎?仍是說要把這個初始化對象的動做放到循環外面的寫法會比較好?編碼
while(true) { A a = new A(); ... sleep(1000) }
答:對象狀況下的結論spa
一、內存和性能
code
若是一個對象實例被聲明在循環內部,那麼每次執行循環體時都會爲對象從新分配內存並初始化對象實例。初始化過程並不會佔用過多的時間,可是內存分配會。在某種狀況下,你可能沒法跑到循環外部去建立對象實例。不過,若是可能的話,重置並重用對象應該是更好的選擇。
二、可讀性
正如我針對基本數據類型喜歡在循環外部進行變量聲明同樣,只要有可能,我就會在循環內部重置對象實例而不是從新建立一個。固然,若是被使用的對象實例很小,而且循環的次數很少的話,那麼這個問題就不是那麼突出了。不過,對這個問題仍是當心一點好
三、結論
如你所見,到底在循環內部或外部進行聲明這個問題,對於對象而言是有差異的;而對於基本數據類型而言,則更多地是我的選擇問題。個人我的觀點是,若是可以在循環體中對對象實例進行重用,那麼最好採用這種方案。從一致性角度講,我相信將變量在循環體外部進行聲明會更好。因此,若是你能對對象實例進行重用,那麼你大可沒必要改變你的編碼習慣。
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();
這樣寫的效果是同樣的,在循環裏第一個循環就是一個新的做用域,上一個就會被覆蓋掉,裏面的對象也就天然不存在了,你能夠直白點想,若是對象會覆蓋那麼循環也會覆蓋,因此就不會衝突了。blog