靜態(tài)方法和實例方法-創(chuàng)新互聯

C#中的方法有兩種:實例方法,靜態(tài)方法。方法一般都是指針引用。使用了static修飾符的方法為靜態(tài)方法,反之則是實例方法。靜態(tài)方法是全局的,實例方法是局部的。二者的內存分配機制不同,靜態(tài)方法是在程序啟動時加載為程序集分配內存時就以經分配內存,而實例方法是在程序運行的時候加載到內存,靜態(tài)方法和靜態(tài)變量的聲明周期和程序集是一樣的

你所需要的網站建設服務,我們均能行業(yè)靠前的水平為你提供.標準是產品質量的保證,主要從事成都做網站、成都網站設計、企業(yè)網站建設、手機網站開發(fā)、網頁設計、品牌網站設計、網頁制作、做網站、建網站。創(chuàng)新互聯建站擁有實力堅強的技術研發(fā)團隊及素養(yǎng)的視覺設計專才。

靜態(tài)方法效率上要比實例化高,靜態(tài)方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。靜態(tài)方法和靜態(tài)變量創(chuàng)建后始終使用同一塊內存,而使用實例的方式會創(chuàng)建多個內存。

靜態(tài)方法是一種特殊的成員方法,它不屬于類的某一個具體的實例,而是屬于類本身,所以在外部調用靜態(tài)方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有后面這種方式。也就是說,調用靜態(tài)方法可以無需創(chuàng)建對象。

靜態(tài)方法只能訪問靜態(tài)成員,實例方法可以訪問靜態(tài)和實例成員。之所以不允許靜態(tài)方法訪問實例成員變量,是因為static方法是類中的一個成員方法是屬于整個類,實例成員變量是屬于某個對象的,而靜態(tài)方法在執(zhí)行時,并不一定存在對象。同樣,因為實例方法可以訪問實例成員變量,如果允許靜態(tài)方法調用實例方法,將間接地允許它使用實例成員變量,所以它也不能調用實例方法。static內部只能出現static變量和其他static方法,而且static方法中不能使用this關鍵字,因為它是屬于整個類的。main()方法是一個典型的靜態(tài)方法,它同樣遵循一般靜態(tài)方法的規(guī)則,所以它可以由系統(tǒng)在創(chuàng)建對象之前就調用。

那么在程序中什么地方可以利用靜態(tài)字段和靜態(tài)構造方法:通常適用于于一些不會經常變化而又頻繁使用的數據,比如連接字符串,配置信息等,當滿足上面所 說的兩點時,進行一次讀取,以后就可以方便的使用了,同時也節(jié)約了托管資源,因為對于靜態(tài)成員,一個靜態(tài)字段只標識一個存儲位置。對一個類無論創(chuàng)建了多少 個實例,它的靜態(tài)字段永遠都只有一個副本(副本我理解為只有一塊內存靜態(tài)成員存在于內存,非靜態(tài)成員需要實例化才會分配內存)。 公用的處理函數,使用靜態(tài)方法應該沒有問題..牽涉到數據共享,靜態(tài)變量的函數要多考慮...靜態(tài)變量要小心使用..靜態(tài)方法 原理就是共享代碼段 共享代碼段不會產生任何問題 因為代碼段都是給CPU作為"讀取"用的,除非你進行惡意"修改"運行時的代碼段 所以靜態(tài)方法是可以放心使用的靜態(tài)變量 原理就是共享數據段 同上 只要沒有進行"寫入"操作就不會產生問題 但是數據通常都是用于讀和寫 所以靜態(tài)變量要注意使用

常見的一些誤區(qū)【摘自下面鏈接】

http://idai.blogbus.com/logs/7078424.html

1、大家都以為“ 靜態(tài)方法常駐內存,實例方法不是,所以靜態(tài)方法效率高但占內存。”

事實上,他們都是一樣的,在加載時機和占用內存上,靜態(tài)方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。

2、大家都以為“ 靜態(tài)方法在堆上分配內存,實例方法在堆棧上”

事實上所有的方法都不可能在堆或者堆棧上分配內存,方法作為代碼是被加載到特殊的代碼內存區(qū)域,這個內存區(qū)域是不可寫的。

方法占不占用更多內存,和它是不是static沒什么關系。

因為字段是用來存儲每個實例對象的信息的,所以字段會占有內存,并且因為每個實例對象的狀態(tài)都不一致(至少不能認為它們是一致的),所以每個實例對象的所以字段都會在內存中有一分拷貝,也因為這樣你才能用它們來區(qū)分你現在操作的是哪個對象。

但方法不一樣,不論有多少個實例對象,它的方法的代碼都是一樣的,所以只要有一份代碼就夠了。因此無論是static還是non-static的方法,都只存在一份代碼,也就是只占用一份內存空間。

同樣的代碼,為什么運行起來表現卻不一樣?這就依賴于方法所用的數據了。主要有兩種數據來源,一種就是通過方法的參數傳進來,另一種就是使用class的成員變量的值……

3、大家都以為“實例方法需要先創(chuàng)建實例才可以調用,比較麻煩,靜態(tài)方法不用,比較簡單”

事實上如果一個方法與他所在類的實例對象無關,那么它就應該是靜態(tài)的,而不應該把它寫成實例方法。所以所有的實例方法都與實例有關,既然與實例有關,那么創(chuàng)建實例就是必然的步驟,沒有麻煩簡單一說。

當然你完全可以把所有的實例方法都寫成靜態(tài)的,將實例作為參數傳入即可,一般情況下可能不會出什么問題。

從面向對象的角度上來說,在抉擇使用實例化方法或靜態(tài)方法時,應該根據是否該方法和實例化對象具有邏輯上的相關性,如果是就應該使用實例化對象  反之使用靜態(tài)方法。這只是從面向對象角度上來說的。

如果從線程安全、性能、兼容性上來看  也是選用實例化方法為宜。

另外有需要云服務器可以了解下創(chuàng)新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

分享文章:靜態(tài)方法和實例方法-創(chuàng)新互聯
文章URL:http://bm7419.com/article8/ipcip.html

成都網站建設公司_創(chuàng)新互聯,為您提供動態(tài)網站、自適應網站、網站導航、做網站小程序開發(fā)、建站公司

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都定制網站建設