2012-04-08 38 views
7

我應該多長時間使用靜態方法?如果我有這樣的:使用靜態方法與對象方法

Class1 _class34 = new Class1(parameter); 

Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4). 

_class34.DoSomething(parameter1, parameter2, parameter3, parameter). 
我在調用類的靜態方法,並在第一個例子中傳遞類的對象一樣的趨勢

這兩個例子的最佳做法是什麼?我應該注意哪些表現,設計和一般實踐?我應該一般使用哪一個,哪一個會在每天的編碼場景中選擇。第一個例子看起來更簡單(你傳遞所有參數並做一些事情),在第二個例子中你必須讀兩遍你正在處理一個對象?

這不是什麼大事,只是想知道。

回答

11

一般來說,靜態方法應該只在任何你想做的事情獨立於類的任何一個實例時使用。如果您需要直接訪問或影響特定實例的狀態,則通常需要使用非靜態方法。

+1

同意。當然,總是有例外,但通常情況下,如果您發現自己將A類的實例傳遞給A類的靜態方法,那麼您可能會做錯了。 – 2012-04-08 21:22:15

+0

如果您將兩個A類實例傳遞給實例「擁有」或在操作中優先的方法,那麼情況如何? – 2012-04-09 15:51:48

+1

你的意思是像一個可交換的二元操作?我已經看到了這兩種方式,但可能仍然使用非靜態方法。 – Taymon 2012-04-10 03:42:15

0

如果您需要該對象,我認爲您應該撥打電話 「_class34.DoSomething(parameter1,parameter2,parameter3,parameter)」。

當你讀到它就像:在對象_Class34上做某事,用這個參數。

2

沒有「更經常」的答案。
這一切都取決於使用的類型。

的底線是:如果指定的類的對象實現/使用,你應該總是使用非靜態方法。 但是,如果沒有單個實例被影響/使用,則應始終使用靜態方法。

在你的榜樣,你正在做的Class1.DoSomething(_class34, parameter1, parameter2, parameter3, parameter4)這是不是一個好方法,因爲它除掉一切準備面向對象編程的給你(如多態等)。

一個很好的例子,其中用於將需要的靜態功能的情況是工廠方法,如String.Parse - 這開始沒有字符串的任何特定實例,但連接到字符串類。

+0

另一個常見的例子是從文件中加載一個對象 - 這通常作爲靜態返回從文件加載的對象。 – Ricibob 2012-04-08 12:44:46

2

這是運行時已經這樣做,每個實例方法的優點在於傳遞一個隱藏的第一個參數。暴露在擴展方法的語法中。

明確做運行時的工作是不是特別有用,語法只是變得更詳細。痛苦的給了你必須提出的名字。考慮_this而不是_class34 :)

0

面向對象編程背後的全部想法是,您不必像過去那樣編寫somefunction(somestruct),而是可以編寫somestruct.somefunction()來代替,這使得它更清晰即somefunction所屬的somestruct

當然你可以用任何你想要的方式來做,但是請記住,你的第二個例子是的方式,這是發明成員函數的原因。

0

靜態成員可能會使單元測試複雜化,因此您必須小心使用它們。

對於大多數情況,我最終爲包含靜態成員的類添加了非靜態包裝器,否則我將無法嘲笑它們。

Static Methods are Death to Testability可能會給你一個更好的想法。

0

但默認情況下,我使用實例方法。 我傾向於僅在比實例方法更有意義或者沒有其他方式時才使用靜態。使用靜態可能會使單元測試複雜化。也使用靜態字段的靜態方法是內存泄漏的潛在來源(即使在.NET中也是如此)。

因此,例如我用靜態時,我想有一個特殊的製作方法制作更加清晰創建過程中發生了什麼,當我通過從文件反序列化它創建對象,如:

MyClass myObject = MyClass.ReadFromFile("serialized.xml"); 

哪個更可讀比:

MyClass myObject = new MyClass("serialized.xml"); 

另外我使用靜態方法(和成員),當我想共享一些全班級的狀態信息之間的所有實例。

當然,靜態成員是必須的,當你的整個類是靜態的。