我有一個維護子對象列表的父對象。定期地,它遍歷子對象列表並在每個對象上調用DoWork方法。偶爾,子對象必須在DoWork方法中引用父對象。每次使用DoWork()方法時,是否最好將引用指向父對象,使用4個字節(正確?)乘以內存子對象的數量,或者將引用傳遞給父對象作爲參數叫什麼名字?如果傳遞額外的參數,開銷是多少? MS .NET在這方面與Mono不同嗎?C#:存儲一個引用還是將它作爲參數傳遞更好?
回答
當子程序被調用堆棧幀被設置爲容納所有的輸入參數,並定義無論是在調用的方法簽名,或作爲本地方法範圍的實例字段的局部變量。因此,無論您將它作爲輸入參數傳遞還是將其作爲本地字段存儲,都不應該有太大區別。
更重要的是,是否有問題的方法都不能從比父對象,如果母公司可能無法使用其他程序調用......如果是這樣,那麼你需要存儲引用作爲孩子的私人領域。
兩者大致相同,即最小。
但是,如果孩子們能永遠從父分離或重新連接到另一個父,那麼你必須在管理孩子存儲的參考的開銷。
我個人認爲,通過「本」從父每次是最好的方式。
是的,這將是很好的避免更新兩個引用 – rotard
中平凡,它似乎是一個更好的想法傳遞一個參考家長的方法,而不是將其存儲。我能想出的最好的推理是方法參數將比垃圾收集器的壓力更小。該引用不受垃圾回收處理,因爲當調用堆棧退出時它會自動清除。此外,如果您需要通過其他實例,則可以輕鬆完成。
-1不理解垃圾收集的麻煩父...的父對象本身在子對象以外的地方被實例化。如果對對象唯一的「可達」引用是存儲在子對象中的引用,那麼你的建議只能起作用,顯然,如果我們談論的父對象可以說是必須在孩子面前實例化的情況,情況並非如此。 –
由於子對象較大,它會增加GC壓力,因此GC在每次收集期間壓縮堆空間時需要爲每個孩子分配(稍微)更多空間。 –
好吧,即使這是重要的(它只有四個字節),這不是你的答案所說...你說的引用「....不受垃圾收集...」,這是不正確的.. 。直到對對象的每個引用已被刪除,引用停留在可達列隊列中。 –
- 1. C++:將枚舉作爲值或作爲const引用傳遞是更好嗎?
- 2. 當引用一個對象時,它是否總是作爲參數傳遞
- 3. C++傳遞一個類作爲參數
- 4. 存儲作爲參數傳遞的引用的內容
- 5. 將一個函數作爲參數傳遞給Javascript,可能還不存在
- 6. C#:將派生類作爲一個通用參數傳遞
- 7. 將一個數組作爲參數傳遞到Oracle存儲過程
- 8. C#將多個類作爲一個參數傳遞
- 9. DDD:在Aggregate中實例化Value對象還是將它作爲參數傳遞?
- 10. 將參數傳遞給選擇器,它是一個參數
- 11. 將函數作爲參數傳遞給存儲過程
- 12. C++將ostream作爲參數傳遞
- 13. 應該將istream作爲參考還是const參考傳遞?
- 14. JSESSIONID是如何傳遞的?作爲標題參數還是作爲cookie參數?
- 15. 將參數從一個存儲過程傳遞到另一個存儲過程
- 16. 哪個更好的存儲照片作爲字節數組還是存儲照片作爲對象的位圖
- 17. 將一個類的實例作爲參數傳遞給C#
- 18. 爲什麼它是不好的使用,如果參數傳遞
- 19. 傳遞引用作爲參數在android
- 20. 將變量作爲參數傳遞給存儲過程
- 21. 如何在存儲過程中將列作爲參數傳遞?
- 22. 將列表結構作爲參數傳遞給存儲過程
- 23. 如何將表名作爲參數傳遞給存儲過程?
- 24. 如何將Datetime值作爲參數傳遞給存儲過程?
- 25. 將參數作爲Xml傳遞到存儲過程
- 26. MySQL存儲過程 - 將SELECT作爲參數傳遞
- 27. 通過引用傳遞還是重新分配?哪個更好/更高效/ etc?
- 28. 在Obj-c/iOS中,最好將秒存儲爲int還是NSNumber?
- 29. 將函數的參數傳遞給堆棧還是寄存器?
- 30. 作爲參數傳遞一個函數?
兩者都遵守CLS。 加上這些孩子從父母繼承? – Zenwalker
父母與孩子無關 – rotard
事實上,您的孩子對象需要父母的引用才能完成他們的工作,這讓我質疑您的設計。父對象有什麼是孩子需要的? –