十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
C#中的方法有兩種:實例方法,靜態(tài)方法。方法一般都是指針引用。使用了static修飾符的方法為靜態(tài)方法,反之則是實例方法。靜態(tài)方法是全局的,實例方法是局部的。二者的內(nèi)存分配機制不同,靜態(tài)方法是在程序啟動時加載為程序集分配內(nèi)存時就以經(jīng)分配內(nèi)存,而實例方法是在程序運行的時候加載到內(nèi)存,靜態(tài)方法和靜態(tài)變量的聲明周期和程序集是一樣的
靜態(tài)方法效率上要比實例化高,靜態(tài)方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。靜態(tài)方法和靜態(tài)變量創(chuàng)建后始終使用同一塊內(nèi)存,而使用實例的方式會創(chuàng)建多個內(nèi)存。
靜態(tài)方法是一種特殊的成員方法,它不屬于類的某一個具體的實例,而是屬于類本身,所以在外部調(diào)用靜態(tài)方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有后面這種方式。也就是說,調(diào)用靜態(tài)方法可以無需創(chuàng)建對象。
靜態(tài)方法只能訪問靜態(tài)成員,實例方法可以訪問靜態(tài)和實例成員。之所以不允許靜態(tài)方法訪問實例成員變量,是因為static方法是類中的一個成員方法是屬于整個類,實例成員變量是屬于某個對象的,而靜態(tài)方法在執(zhí)行時,并不一定存在對象。同樣,因為實例方法可以訪問實例成員變量,如果允許靜態(tài)方法調(diào)用實例方法,將間接地允許它使用實例成員變量,所以它也不能調(diào)用實例方法。static內(nèi)部只能出現(xiàn)static變量和其他static方法,而且static方法中不能使用this關鍵字,因為它是屬于整個類的。main()方法是一個典型的靜態(tài)方法,它同樣遵循一般靜態(tài)方法的規(guī)則,所以它可以由系統(tǒng)在創(chuàng)建對象之前就調(diào)用。
那么在程序中什么地方可以利用靜態(tài)字段和靜態(tài)構造方法:通常適用于于一些不會經(jīng)常變化而又頻繁使用的數(shù)據(jù),比如連接字符串,配置信息等,當滿足上面所 說的兩點時,進行一次讀取,以后就可以方便的使用了,同時也節(jié)約了托管資源,因為對于靜態(tài)成員,一個靜態(tài)字段只標識一個存儲位置。對一個類無論創(chuàng)建了多少 個實例,它的靜態(tài)字段永遠都只有一個副本(副本我理解為只有一塊內(nèi)存靜態(tài)成員存在于內(nèi)存,非靜態(tài)成員需要實例化才會分配內(nèi)存)。 公用的處理函數(shù),使用靜態(tài)方法應該沒有問題..牽涉到數(shù)據(jù)共享,靜態(tài)變量的函數(shù)要多考慮...靜態(tài)變量要小心使用..靜態(tài)方法 原理就是共享代碼段 共享代碼段不會產(chǎn)生任何問題 因為代碼段都是給CPU作為"讀取"用的,除非你進行惡意"修改"運行時的代碼段 所以靜態(tài)方法是可以放心使用的靜態(tài)變量 原理就是共享數(shù)據(jù)段 同上 只要沒有進行"寫入"操作就不會產(chǎn)生問題 但是數(shù)據(jù)通常都是用于讀和寫 所以靜態(tài)變量要注意使用
常見的一些誤區(qū)【摘自下面鏈接】
http://idai.blogbus.com/logs/7078424.html
1、大家都以為“ 靜態(tài)方法常駐內(nèi)存,實例方法不是,所以靜態(tài)方法效率高但占內(nèi)存。”
事實上,他們都是一樣的,在加載時機和占用內(nèi)存上,靜態(tài)方法和實例方法是一樣的,在類型第一次被使用時加載。調(diào)用的速度基本上沒有差別。
2、大家都以為“ 靜態(tài)方法在堆上分配內(nèi)存,實例方法在堆棧上”
事實上所有的方法都不可能在堆或者堆棧上分配內(nèi)存,方法作為代碼是被加載到特殊的代碼內(nèi)存區(qū)域,這個內(nèi)存區(qū)域是不可寫的。
方法占不占用更多內(nèi)存,和它是不是static沒什么關系。
因為字段是用來存儲每個實例對象的信息的,所以字段會占有內(nèi)存,并且因為每個實例對象的狀態(tài)都不一致(至少不能認為它們是一致的),所以每個實例對象的所以字段都會在內(nèi)存中有一分拷貝,也因為這樣你才能用它們來區(qū)分你現(xiàn)在操作的是哪個對象。
但方法不一樣,不論有多少個實例對象,它的方法的代碼都是一樣的,所以只要有一份代碼就夠了。因此無論是static還是non-static的方法,都只存在一份代碼,也就是只占用一份內(nèi)存空間。
同樣的代碼,為什么運行起來表現(xiàn)卻不一樣?這就依賴于方法所用的數(shù)據(jù)了。主要有兩種數(shù)據(jù)來源,一種就是通過方法的參數(shù)傳進來,另一種就是使用class的成員變量的值……
3、大家都以為“實例方法需要先創(chuàng)建實例才可以調(diào)用,比較麻煩,靜態(tài)方法不用,比較簡單”
事實上如果一個方法與他所在類的實例對象無關,那么它就應該是靜態(tài)的,而不應該把它寫成實例方法。所以所有的實例方法都與實例有關,既然與實例有關,那么創(chuàng)建實例就是必然的步驟,沒有麻煩簡單一說。
當然你完全可以把所有的實例方法都寫成靜態(tài)的,將實例作為參數(shù)傳入即可,一般情況下可能不會出什么問題。
從面向?qū)ο蟮慕嵌壬蟻碚f,在抉擇使用實例化方法或靜態(tài)方法時,應該根據(jù)是否該方法和實例化對象具有邏輯上的相關性,如果是就應該使用實例化對象 反之使用靜態(tài)方法。這只是從面向?qū)ο蠼嵌壬蟻碚f的。
如果從線程安全、性能、兼容性上來看 也是選用實例化方法為宜。
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。