2011-09-09 34 views
1

我有一個維護子對象列表的父對象。定期地,它遍歷子對象列表並在每個對象上調用DoWork方法。偶爾,子對象必須在DoWork方法中引用父對象。每次使用DoWork()方法時,是否最好將引用指向父對象,使用4個字節(正確?)乘以內存子對象的數量,或者將引用傳遞給父對象作爲參數叫什麼名字?如果傳遞額外的參數,開銷是多少? MS .NET在這方面與Mono不同嗎?C#:存儲一個引用還是將它作爲參數傳遞更好?

+0

兩者都遵守CLS。 加上這些孩子從父母繼承? – Zenwalker

+0

父母與孩子無關 – rotard

+1

事實上,您的孩子對象需要父母的引用才能完成他們的工作,這讓我質疑您的設計。父對象有什麼是孩子需要的? –

回答

1

當子程序被調用堆棧幀被設置爲容納所有的輸入參數,並定義無論是在調用的方法簽名,或作爲本地方法範圍的實例字段的局部變量。因此,無論您將它作爲輸入參數傳遞還是將其作爲本地字段存儲,都不應該有太大區別。

更重要的是,是否有問題的方法都不能從比父對象,如果母公司可能無法使用其他程序調用......如果是這樣,那麼你需要存儲引用作爲孩子的私人領域。

1

兩者大致相同,即最小。

但是,如果孩子們能永遠從父分離或重新連接到另一個父,那麼你必須在管理孩子存儲的參考的開銷。

我個人認爲,通過「本」從父每次是最好的方式。

+0

是的,這將是很好的避免更新兩個引用 – rotard

0

中平凡,它似乎是一個更好的想法傳遞一個參考家長的方法,而不是將其存儲。我能想出的最好的推理是方法參數將比垃圾收集器的壓力更小。該引用不受垃圾回收處理,因爲當調用堆棧退出時它會自動清除。此外,如果您需要通過其他實例,則可以輕鬆完成。

+0

-1不理解垃圾收集的麻煩父...的父對象本身在子對​​象以外的地方被實例化。如果對對象唯一的「可達」引用是存儲在子對象中的引用,那麼你的建議只能起作用,顯然,如果我們談論的父對象可以說是必須在孩子面前實例化的情況,情況並非如此。 –

+0

由於子對象較大,它會增加GC壓力,因此GC在每次收集期間壓縮堆空間時需要爲每個孩子分配(稍微)更多空間。 –

+0

好吧,即使這是重要的(它只有四個字節),這不是你的答案所說...你說的引用「....不受垃圾收集...」,這是不正確的.. 。直到對對象的每個引用已被刪除,引用停留在可達列隊列中。 –

相關問題