ReSharper有時會提示我可以在我的WebForms靜態中創建一些隨機實用程序方法。我爲什麼要這樣做?據我所知,這樣做沒有好處..或者有嗎?我在WebForms中的靜態成員中缺少什麼?ReSharper提示我應該在WebForms中執行靜態方法 - 爲什麼?我錯過了什麼嗎?
回答
你會得到一個性能提升,FxCop規則CA1822是一樣的。
從MSDN:不訪問實例 數據或致電實例方法
的方法可以 標記爲靜態的(在Visual 基本共享)。將方法標記爲 靜態後,編譯器將向這些 成員發出 非虛擬調用站點。發送非虛擬呼叫 站點將阻止在運行時檢查每個呼叫,以確保 當前對象指針非空。 這可能會導致 性能敏感的代碼的可測量的 性能增益。在某些情況下 ,訪問 當前對象實例失敗表示 正確性問題
Resharper建議將方法轉換爲靜態,如果它們不使用類中的任何非靜態變量或方法。
效益可能是一個小的性能提升(應用程序將使用較少的內存),而且會有一個少ReSharper的警告;)
+1 FWIW,Visual Studio(或FxCop)的內置代碼分析引擎對同樣的事情發出警告。 – 2010-01-05 09:13:03
爲什麼應用程序使用較少的內存? – 2010-01-05 15:14:52
我不會介意任何性能改進,但你可能會喜歡的,是靜態方法對實例沒有副作用。所以,除非你有很多的靜態(你呢?)這表明你的意圖是這個方法類似於一個函數,只查看參數和(可選)返回結果。
對我來說,這是一個很好的提示,當我讀別人的代碼。我不太關心共享狀態,並且可以更輕鬆地看到信息流。通過將它聲明爲靜態,它的功能受到了更多的限制,這對讀者來說不用擔心。
您認爲靜態方法在某種程度上阻止了實例的變異是錯誤的。靜態方法可以像實例方法一樣改變實例。 – 2010-01-05 15:14:15
的真正原因是不是表現的原因 - 將在一秒鐘的十億來衡量,如果它有什麼作用在所有。
真正的原因是不使用實例的實例方法在邏輯上是一個設計缺陷。假設我給你寫了一個方法:
class C
{
public int DoubleIt(int x, string y, Type z)
{
return x * 2;
}
}
這是一個精心設計的方法嗎?不需要。它需要各種信息,然後忽略它們,不用它來計算結果或執行副作用。爲什麼強制調用者傳入不必要的字符串和類型?
現在,請注意,此方法還會以傳入該調用的「this」的形式接受C語言。這也被忽略。這個方法應該是靜態的,並且需要一個參數。
一個設計良好的方法需要精確計算其所需的信息來計算其結果並執行其副作用,不多也不少。 Resharper告訴你,你的代碼中有一個設計缺陷:你有一種方法正在接收它忽略的信息。要麼修復該方法,以便開始使用該信息,要麼通過使方法靜態來阻止傳遞無用的數據。
同樣,性能問題是一個總的紅鯡魚;你永遠都不會注意到這種差別很小,除非你正在做的是少量處理器週期。警告的原因是請您注意邏輯設計缺陷。正確執行程序邏輯遠比在這裏和那裏削減納秒更重要。
- 1. 擴展方法VS靜態方法解析 - 我在spec中錯過了什麼?
- 2. 爲什麼我不應該使用靜態導入Mockito方法?
- 3. Python:我錯過了什麼嗎?
- 4. VB.Net - FileInfo.FullName - 我錯過了什麼嗎?
- 5. WPF DataGridTemplateColumn。我錯過了什麼嗎?
- 6. C++多態性:我錯過了什麼?
- 7. 我在Acumatica處理頁面執行中錯過了什麼
- 8. UserControls:我錯過了什麼?
- 9. NuGet - 我錯過了什麼?
- 10. 我錯過了什麼?
- 11. 我錯過了什麼ActionListener?
- 12. jsFiddle - 我錯過了什麼?
- 13. 我錯過了什麼?
- 14. 響應網站:我錯過了什麼?
- 15. 我在Java塊中錯過了什麼?
- 16. 什麼時候應該在基類中聲明靜態方法?
- 17. 爲什麼我無法爲靜態類創建擴展方法?
- 18. 什麼是靜態方法同步嗎?
- 19. 爲什麼Resharper在這裏給我一個'Localizable Interpolated String'提示?
- 20. 爲什麼我的SQL語法錯了?
- 21. 什麼時候我們應該去java中的靜態類,變量和方法
- 22. 爲什麼我的OS X文件可執行;我應該改變它嗎?
- 23. 爲什麼我的登錄方法聲明爲靜態?
- 24. 爲什麼我不能將此方法標記爲靜態?
- 25. 我在做諾言錯了......我在這裏錯過了什麼?
- 26. 爲什麼我的jquery change()方法不能在jira中執行?
- 27. 我錯過了什麼?在此代碼
- 28. Clojure:我從comp中錯過了什麼?
- 29. 我在做什麼錯了?
- 30. 爲什麼我不能在類/靜態方法中使用private,internal,fileprivate方法?
關鍵詞有「對性能敏感的代碼」。這種差異是以十億分之一秒來衡量的。 – 2010-01-05 15:12:49