2013-03-07 56 views
2

這只是爲了滿足我的好奇心。是否有這樣做的其中一個比其他對於簡單功能靜態優於靜態優勢

public static void Save(Guid id, int a, string b) 
{ 
    //Save a and b to the database using PK id 
} 

OVER的任何區別或優勢:

Guid ID {get; set;} 
int A {get; set;} 
string B {get ;set;} 

public void Save() 
{ 
    //Save A and B to the database using PK ID 
} 

編輯: 好一些背景:所以Web UI的JSON傳遞到靜態頁面的方法。 Page Method分析JSON並將新變量傳遞給其他DLL中的靜態類。這然後使用實體框架來更新數據庫。這個可以嗎?

+0

我想你在示例中缺少一些狀態 - 數據庫連接或信息。我不認爲你的第一種方法可能真的是靜態的。 – 2013-03-07 22:42:24

+1

您現在對這個問題有七個不同的答案,其中許多答案是「取決於」或「我更喜歡」。有些人始終把它當作一個對象發誓。我還記得[Rich Hickey](https://twitter.com/richhickey)在談論Java如何使用靜態方法的所有方面(他繼續創建[Clojure](http://clojure.org/) ))。我覺得很舒服,說這個問題沒有「正確」的答案。另請參閱[關於程序員堆棧交換的這個問題](http://programmers.stackexchange.com/questions/98083/cant-i-just-use-all-static-methods)以獲取更多想法。 – 2013-03-08 18:07:48

回答

0

真的,這取決於你所使用的方法的情況。

例如,如果你執行一個命令模式,你不想每次都實例化一個對象,靜態方法可能會有用。

同樣,如果你只是添加一些功能的類,真的沒有任何意義使該方法靜態。

這些意思都不是更好比其他。這僅僅意味着它們有不同的用途。槍是一個非常有用的工具包,但不是當你試圖關閉電視時。看到我的觀點?

+0

但是,如果我在一個類中有兩個,那麼如果一段代碼設置了屬性並稱爲非靜態代碼,並且另一段代碼在參數中傳遞給靜態代碼,那麼它們之間絕對沒有區別?例如在性能(或其他)? – Neil 2013-03-07 22:39:07

+0

如果你設置字段,那麼調用非靜態方法,那麼它可能會更慢,但我沒有看到只是填充非靜態方法的一些參數有什麼問題。我看到你的問題。從邏輯上講,靜態方法可能會更快,因爲您從不需要首先創建對象。總的來說,這會加快執行時間。 – christopher 2013-03-07 22:41:09

0

密封功能始終優先於未密封,因爲JITTER可以(選擇)內聯前者。靜態函數始終是密封的,所有密封類中的方法都是如此。但是,避免將屬性複製到靜態上也是優選的。

正如克里斯在上面所說的,你需要根據具體情況來決定。 99%的時間無關緊要,因爲性能足夠好,或者瓶頸在其他地方,所以請保持代碼清潔。

+0

我不認爲「密封」在這裏是相關的。默認情況下,靜態方法和實例方法都不是虛擬的。 (關鍵詞:虛擬 - 你需要添加到(實例)方法簽名參與多態性和「開封」你的功能) – 2013-03-07 23:42:07

+0

@Kirk:是的,回想起來,我的回答沒有看起來那麼深刻時間。 – 2013-03-07 23:49:32

0

這基本上是「OOP與結構編程的優勢」。在你的情況下,數據庫連接會有所不同:它可以是類的字段,並且你可以在構造函數中提供一次。如果需要的話,這些方法可以使用它。 使用靜態方法,您需要提供參數中的所有內容,甚至包含始終相同的內容。

不依賴於對象內部狀態的方法應該是靜態的。

1

您提供的示例似乎表明您正在編寫某種持久性API,爲此我強烈建議使用可實例化的類。使用靜態方法對於實用程序類來說是可以的,但是如果你使用靜態方法,你會很快發現你的代碼變得不可擴展和不可維護。

2

我絕對會更喜歡靜態的實例方法。原因在於靜態方法意味着您必須將全局可變狀態引入到您的系統中。爲了起作用,靜態方法需要訪問某種類型的數據庫連接,並靜態執行。

應儘可能避免全局可變狀態。這是一個即將到來的bug farm,並且會阻礙你的代碼庫的未來變化(例如引入多個線程)。