2010-07-13 185 views
7

我的理解方式是,在非靜態類中聲明爲static的成員變量會導致該成員變量是唯一的,無論該類的實例數是多少。在非靜態類中聲明一個靜態方法的意義是什麼?

現在,在非靜態類中聲明的靜態方法會發生什麼?和(最重要的是),在非靜態類中聲明靜態方法的意義是什麼?

感謝您的幫助

+3

我不會在這裏使用單詞'unique'。它在所有實例之間共享_shared_。 – 2010-07-13 11:31:18

+0

@亨克霍爾特曼:謝謝你糾正我。 – Richard77 2010-07-13 11:36:58

回答

4

僅與其參數一起工作的類方法,不調用任何實例方法,不適用於任何實例成員,可以聲明爲靜態。實際上,它應該被聲明爲靜態的,以獲得更好的性能,因爲靜態方法不需要「this」指針。

考慮屬於類的小函數,對其參數進行一些計算並返回計算值。這個功能應該是靜態的。

+1

我會評價靜態正確性檢查比性能更高。通過將方法聲明爲靜態,您可以讓編譯器知道它不能使用任何特定於特定實例的信息,所以當程序員試圖這樣做時,它會拋出錯誤或警告,例如,試圖將其稱爲實例方法。 – reinierpost 2011-03-24 09:36:31

21

如果該方法有事情做與類型,但不是實例那麼它可以是靜態的。

DateTime.ParseInt32.Parse是例子。

+10

還有一個指導方針是「如果它可以是靜態的而不是靜態的」。 – 2010-07-13 11:31:56

+2

與亨克霍爾特曼的評論相關:http://stackoverflow.com/questions/790281 – 2010-07-13 11:36:20

2

例如,您有一個例如Bank_Account的類,您要在其中計算爲該類創建的對象的數量。
所以,你有一個靜態字段說count。然後,當初始化Bank_Account類的任何對象時,則需要增加存儲爲此類創建的對象數的字段,但增加此靜態變量的方法是靜態的,因爲爲此類創建的所有對象都是相同的。

+0

爲什麼這個答案是downvoted ??? :-(這也是說什麼'ck's''答案是說,但它是這種方法的例子!! – Himadri 2010-07-13 11:42:56

+1

我不明白downvote要麼:在我看來這是一個重要的一點。如果你有數據是關於所有實例或任何實例,而不是一個特定的實例,那麼它應該是靜態的。例如,就在昨天,我創建了一個類,我需要爲每個實例分配一個唯一的ID。製作一個靜態計數器是一種簡單而合乎邏輯的方式 – Jay 2010-07-13 13:46:10

1

由於ck表示,它可能是與該類型有關的方法。重要的是要記住,這將是一個效用函數,它不能訪問類型/類中的任何成員變量,因爲它可以直接調用而不需要任何類的實例。如果您嘗試定義訪問成員變量(或非靜態方法)的靜態方法,則實際上會出現編譯器錯誤。

5

對於創建工廠方法非常有用,它不是任何對象的成員,但需要訪問對象的內部以初始化它。

5

您需要非靜態類f.e中的靜態方法。對於工廠模式(如果類是其自身的工廠,由雅各·比勒陀利烏斯指出):

MyClass newInstance = MyClass.Create(); 

或者,如果你想創建的helper方法。 F.E.你可以寫一個FTP-類,這是完全正常工作,與Connect()SendCommand()ReceiveAnswer()Disconnect()等,但要允許用戶方便地上傳一個文件,而不需要實現整個過程:

MyFTPClass.UploadFile("username", "password", "pathToFile"); 
+1

我正在迂腐 - 如果類是工廠本身,你的第一句話是正確的。當我使用工廠模式時,我通常會創建單獨的工廠類,因爲它使測試變得更容易一些。 – 2010-07-13 14:06:32

3

如果不能在非靜態類中聲明靜態方法(和私有成員變量),就不可能實現Singleton模式。

請參閱Singleton

相關問題