2014-02-14 35 views
1

我有一堆(可能是10到15)在我的C#代碼中的所有這些都是'靜態'。顯然,它們都是用ClassName調用的。一切運作良好。但是,它們以這種方式使用它們有什麼優點/缺點嗎?或者如果我不爲我的方法使用「靜態」,我會獲得任何性能優勢嗎?什麼時候使用C#中的'靜態方法'

+0

這個問題可能有點哲學。事情是 - 你不能清楚地回答這個問題,而不知道你的軟件設計。 – TGlatzer

+0

而不是一個優點 - 缺點是這可以使你的代碼有點難以進行單元測試。你不能在你的代碼中注入靜態類,所以很難模擬。 – Paddy

+0

這裏有一些很好的答案:http://programmers.stackexchange.com/questions/111938/which-is-a-better-practice-helper-methods-as-instance-or-static – Paddy

回答

4

從技術上講,使用靜態方法會帶來輕微的性能優勢,因爲執行方法時無需將實例引用加載到堆棧。但那是你不會注意到的非常小的優化。

從編程的角度來看,靜態方法很難模擬,它們在代碼中引入了強大的耦合。在使用靜態方法時,您也會失去抽象和多態性的好處。

您可以從不使用實例數據的實例方法創建靜態私有方法。但是公共靜態方法通常會給你帶來模擬和依賴注入的問題,所以通常我會避免它們。一個例外是用於創建類的實例的工廠方法 - Loan.CreateLongTermLoan(因此,您不能在C#中使用具有自定義名稱的構造函數,但您需要描述創建實例的詳細信息的描述性名稱)或Loan.Parse

+0

我的大多數方法與數據庫並將值傳回給調用者。很少有方法會傳回大量數據......因此,將它們作爲Static有什麼危害? – Abhi

+0

返回數據的大小不影響要使用哪種類型的方法 - 靜態或實例。如果您不打算爲您的業務邏輯創建單元測試,並且您完全確定始終使用相同的數據提供程序,那麼您可以使用靜態方法。你的系統將很難測試,並且它將被強烈耦合。但並非所有系統都需要可測試性和靈活性。 –

+0

太好了。應用程序的可測試性不是優先級,數據提供者不會改變。所以,我想我會把它們保留爲靜態。 – Abhi

2

如果您擔心靜態方法在實例方法上的性能優勢,那麼您就是微型優化,並且無疑會過早地進行優化。在擔心這種事情之前,你應該擔心好的課程設計!

如果你有一些方法不能對實例的狀態進行操作,那麼它們是靜態方法的好選擇。例如,工廠方法是靜態方法的一個明顯的用法。

如果你有方法操作實例的狀態,那麼它們需要是實例(非靜態)方法。例如,更改成員變量的方法不能是靜態的。

提示:在IL級別,所有實例方法都通過CallVirt指令調用,即使它們不是虛擬的。如果您在空引用上調用方法,則允許運行時生成NullReferenceException。通過Call指令調用靜態方法。

+1

+1:爲清楚答案。 –

+0

你能解釋一下嗎「如果你有一些方法不能在一個實例的狀態下運行,那麼它們就是靜態方法的好選擇,如果你有方法根據實例的狀態進行操作,那麼它們需要是實例(非靜態)方法。「? – Abhi

+0

@Abhi - 我在答案中添加了更多信息 – Sean

1

靜態與否都沒有性能優勢。

如果您不需要某個方法中的類的實例,那麼它將被標記爲static

1

靜態方法的問題出現在你需要一個子類的時刻。

靜態方法不能在子類中重寫,因此你的新類不能提供方法的新實現,使它們不太有用。

1

這是一個概念性問題。方法...

  • 屬於一個特定實例?那麼它不是靜態的。
  • 屬於而不是特定的實例?那麼它是靜態的主要候選者。

請注意,靜態方法無法訪問對象的實例成員(非靜態成員)。

相關問題