2010-01-05 50 views

回答

4

你會得到一個性能提升,FxCop規則CA1822是一樣的。

MSDN:不訪問實例 數據或致電實例方法

的方法可以 標記爲靜態的(在Visual 基本共享)。將方法標記爲 靜態後,編譯器將向這些 成員發出 非虛擬調用站點。發送非虛擬呼叫 站點將阻止在運行時檢查每個呼叫,以確保 當前對象指針非空。 這可能會導致 性能敏感的代碼的可測量的 性能增益。在某些情況下 ,訪問 當前對象實例失敗表示 正確性問題

+1

關鍵詞有「對性能敏感的代碼」。這種差異是以十億分之一秒來衡量的。 – 2010-01-05 15:12:49

2

Resharper建議將方法轉換爲靜態,如果它們不使用類中的任何非靜態變量或方法。

效益可能是一個小的性能提升(應用程序將使用較少的內存),而且會有一個少ReSharper的警告;)

+0

+1 FWIW,Visual Studio(或FxCop)的內置代碼分析引擎對同樣的事情發出警告。 – 2010-01-05 09:13:03

+3

爲什麼應用程序使用較少的內存? – 2010-01-05 15:14:52

5

我不會介意任何性能改進,但你可能會喜歡的,是靜態方法對實例沒有副作用。所以,除非你有很多的靜態(你呢?)這表明你的意圖是這個方法類似於一個函數,只查看參數和(可選)返回結果。

對我來說,這是一個很好的提示,當我讀別人的代碼。我不太關心共享狀態,並且可以更輕鬆地看到信息流。通過將它聲明爲靜態,它的功能受到了更多的限制,這對讀者來說不用擔心。

+2

您認爲靜態方法在某種程度上阻止了實例的變異是錯誤的。靜態方法可以像實例方法一樣改變實例。 – 2010-01-05 15:14:15

9

的真正原因是不是表現的原因 - 將在一秒鐘的十億來衡量,如果它有什麼作用在所有。

真正的原因是不使用實例的實例方法在邏輯上是一個設計缺陷。假設我給你寫了一個方法:

class C 
{ 
    public int DoubleIt(int x, string y, Type z) 
    { 
    return x * 2; 
    } 
} 

這是一個精心設計的方法嗎?不需要。它需要各種信息,然後忽略它們,不用它來計算結果或執行副作用。爲什麼強制調用者傳入不必要的字符串和類型?

現在,請注意,此方法還會以傳入該調用的「this」的形式接受C語言。這也被忽略。這個方法應該是靜態的,並且需要一個參數。

一個設計良好的方法需要精確計算其所需的信息來計算其結果並執行其副作用,不多也不少。 Resharper告訴你,你的代碼中有一個設計缺陷:你有一種方法正在接收它忽略的信息。要麼修復該方法,以便開始使用該信息,要麼通過使方法靜態來阻止傳遞無用的數據。

同樣,性能問題是一個總的紅鯡魚;你永遠都不會注意到這種差別很小,除非你正在做的是少量處理器週期。警告的原因是請您注意邏輯設計缺陷。正確執行程序邏輯遠比在這裏和那裏削減納秒更重要。

相關問題