簡體   English   中英

我應該將我的私有類方法設為靜態嗎?

[英]Should I make my private class methods static?

有沒有最好的做法讓類靜態的私有方法? 我有一個有幾種方法的課。 其中一些很容易變得靜態,因為它們只是處理數據。

我應該讓它們靜止還是只是保持原樣? 這更像是一種風格問題嗎? 有性能考慮嗎?

編輯: 方法可以做成靜態,但應該嗎?

如果方法不訪問任何類型的狀態,那么它們應該是靜態的。

靜態方法調用提供了比實例方法更高的性能,並且靜態方法的存在告訴未來讀者您的代碼調用此方法將不會在該類型的當前實例的狀態中產生任何副作用。

靜態方法的性能增益來自於編譯器不必發出callvirt指令來調用靜態方法的事實。 callvirt指令對於實例調用很方便,因為它在調用方法之前進行null檢查。 但是,當您調用靜態方法時,不需要檢查null因此編譯器可以自由地發出不檢查null的更快的call指令。

正如Dan Diplo所說,如果它們可以變得靜止,那么它們應該是靜止的。 這僅適用於私有靜態方法(這是您所詢問的)。 但是,對於公共方法,它們只會混淆您班級的用戶。 公共方法只有在沒有調用者的類實例的情況下使用時才應該是靜態的 ,不會使它們成為靜態的性能損失。

我總是認為如果它們可以被靜態化(並且編譯器很快會讓你知道它們是否可以),那么它們應該是這樣的。 有關進一步的討論,請參閱SO上的重復問題

當我確定它們沒有任何副作用時,我只會使方法靜止。

如果方法不使用類中的任何實例數據,則它應該是靜態的。 這樣很明顯,它獨立於實例,並且您不必創建實例來調用它。

任何性能差異都不應該成為一個問題。 當然,靜態方法和實例方法的調用方式不同,但您很可能無法測量任何一致的性能差異。 差異是如此之小,以至於有時調用實例方法可能實際上更快,因為指令恰好在執行中排隊。

我同意所有可以是靜態的私有方法都應該是靜態的。 請記住,2之間的性能差異是微不足道的,所以不要這樣做以試圖提高性能,因為早期優化可能會導致更多的失敗而不是成功,直到您確定您遇到性能問題並分析您的應用程序。

想想靜態方法和多線程。 你必須非常小心。 這種觀點就像模式定義:“在某種情況下解決問題的方法。” 你不能說“這應該這樣做”。 這取決於具體情況。

如果你有一個靜態私有方法,那就好像它可能是一個根本不應該在類中的方法,而應該是一個靜態方法庫,可以被其他類重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM