循環引用指的是A引用了B,而B又引用了A。在寫代碼的時候,都難免會這樣寫:地圖引用了戰鬥單位,戰鬥單位又引用了地圖。。
如圖:(來源於國外大神的解釋)
當A沒有再被其他類引用,則A,B,C都應該被垃圾回收。如果判斷該對象是否需要被回收的依據是基於引用計數的,那上面代碼就會是這樣:B被C和A引了,引用計數爲2,C被B引了,引用計數爲1,這樣內存就泄露了。
所以C#的GC並沒有用引用計數。GC有一些“根”,對象都掛在上面。從“根”往其子結點進行遍歷,就可以標註出哪些對象是被使用的。A對象沒有被其他引用,A作爲B,C的入口,所以A,B,C都變成了被回收的對象。
綜上,C#在做循環引用的時候是不會出現垃圾回收問題的。