我的理解方式是,在非靜態類中聲明爲static的成員變量會導致該成員變量是唯一的,無論該類的實例數是多少。在非靜態類中聲明一個靜態方法的意義是什麼?
現在,在非靜態類中聲明的靜態方法會發生什麼?和(最重要的是),在非靜態類中聲明靜態方法的意義是什麼?
感謝您的幫助
我的理解方式是,在非靜態類中聲明爲static的成員變量會導致該成員變量是唯一的,無論該類的實例數是多少。在非靜態類中聲明一個靜態方法的意義是什麼?
現在,在非靜態類中聲明的靜態方法會發生什麼?和(最重要的是),在非靜態類中聲明靜態方法的意義是什麼?
感謝您的幫助
僅與其參數一起工作的類方法,不調用任何實例方法,不適用於任何實例成員,可以聲明爲靜態。實際上,它應該被聲明爲靜態的,以獲得更好的性能,因爲靜態方法不需要「this」指針。
考慮屬於類的小函數,對其參數進行一些計算並返回計算值。這個功能應該是靜態的。
我會評價靜態正確性檢查比性能更高。通過將方法聲明爲靜態,您可以讓編譯器知道它不能使用任何特定於特定實例的信息,所以當程序員試圖這樣做時,它會拋出錯誤或警告,例如,試圖將其稱爲實例方法。 – reinierpost 2011-03-24 09:36:31
如果該方法有事情做與類型,但不是實例那麼它可以是靜態的。
DateTime.Parse
和Int32.Parse
是例子。
還有一個指導方針是「如果它可以是靜態的而不是靜態的」。 – 2010-07-13 11:31:56
與亨克霍爾特曼的評論相關:http://stackoverflow.com/questions/790281 – 2010-07-13 11:36:20
例如,您有一個例如Bank_Account
的類,您要在其中計算爲該類創建的對象的數量。
所以,你有一個靜態字段說count
。然後,當初始化Bank_Account
類的任何對象時,則需要增加存儲爲此類創建的對象數的字段,但增加此靜態變量的方法是靜態的,因爲爲此類創建的所有對象都是相同的。
由於ck表示,它可能是與該類型有關的方法。重要的是要記住,這將是一個效用函數,它不能訪問類型/類中的任何成員變量,因爲它可以直接調用而不需要任何類的實例。如果您嘗試定義訪問成員變量(或非靜態方法)的靜態方法,則實際上會出現編譯器錯誤。
對於創建工廠方法非常有用,它不是任何對象的成員,但需要訪問對象的內部以初始化它。
您需要非靜態類f.e中的靜態方法。對於工廠模式(如果類是其自身的工廠,由雅各·比勒陀利烏斯指出):
MyClass newInstance = MyClass.Create();
或者,如果你想創建的helper方法。 F.E.你可以寫一個FTP-類,這是完全正常工作,與Connect()
,SendCommand()
,ReceiveAnswer()
,Disconnect()
等,但要允許用戶方便地上傳一個文件,而不需要實現整個過程:
MyFTPClass.UploadFile("username", "password", "pathToFile");
我正在迂腐 - 如果類是工廠本身,你的第一句話是正確的。當我使用工廠模式時,我通常會創建單獨的工廠類,因爲它使測試變得更容易一些。 – 2010-07-13 14:06:32
如果不能在非靜態類中聲明靜態方法(和私有成員變量),就不可能實現Singleton模式。
請參閱Singleton
我不會在這裏使用單詞'unique'。它在所有實例之間共享_shared_。 – 2010-07-13 11:31:18
@亨克霍爾特曼:謝謝你糾正我。 – Richard77 2010-07-13 11:36:58