2012-08-15 130 views
4

從內存分配的角度來看,創建無狀態靜態實用類與無狀態非靜態實用類有什麼區別嗎?根據我的理解,靜態類可能實際上會更好,因爲在GC堆上不會分配對象。只有方法表將在高頻堆上創建,而對於非靜態類,將在GC堆上與HF堆上的方法表一起創建一個對象。需要你們的幫助來確認它,並請告訴我是否缺少其他考慮因素。實用程序/助手無狀態靜態類vs無狀態非靜態類

+2

微。優化。 – Oded 2012-08-15 19:00:12

+0

確實......你需要做多少個非靜態類的實例化? – spender 2012-08-15 19:09:18

+0

@spender:這是我認爲需要建議的地方。一個非靜態類將不得不被實例化,以便訪問任何成員,而靜態類不會有這樣的需求。一個非靜態類可以實現爲單例類,以避免多個實例,因爲空對象會消耗12個字節的內存,但如果類由純實用程序成員組成,那麼這似乎不值得付出努力。 – jags 2012-08-15 19:36:54

回答

4

是的。如果這些方法都是靜態的,那麼沒有實例將在託管堆上。每次調用時,都會直接引用該類型並訪問它的成員,而無需在堆上分配內存。

如果您有一個實例類,那麼每次創建實例時,都會在堆上產生成本。如果你還沒有堅持引用,那麼你將在CLR的第0代產生高流失。這假定你將創建大量的對象來進行這些調用。

當然,如果您正在實施the singleton pattern,那麼成本將會很小,因爲您只需實施一個單個實例對象。

但是,這一切都沒有實際意義,因爲它是一個micro optimization;除非您發現自己創建了大量這些對象來執行此功能,並且通過分析確定您實際上存在問題,那麼它應該是最簡單的維護問題。

雖然我會說,如果一個方法是無狀態的,它自然看起來像它將運行一個現有的類型,那麼我通常會寫一個extension method;它是一個靜態的調用,但給出了一個實例調用的外觀,這對於一些(和我本人而言)在代碼中具有比直接調用靜態方法更好的流程(尤其是當它使我能夠設計fluent interface時)。

+0

非常感謝!擴展方法絕對是實現幫助器方法的更好方法。 – jags 2012-08-15 19:49:50