您好,登錄后才能下訂單哦!
C#中的方法有兩種:實例方法,靜態方法。方法一般都是指針引用。使用了static修飾符的方法為靜態方法,反之則是實例方法。靜態方法是全局的,實例方法是局部的。二者的內存分配機制不同,靜態方法是在程序啟動時加載為程序集分配內存時就以經分配內存,而實例方法是在程序運行的時候加載到內存,靜態方法和靜態變量的聲明周期和程序集是一樣的
靜態方法效率上要比實例化高,靜態方法的缺點是不自動進行銷毀,而實例化的則可以做銷毀。靜態方法和靜態變量創建后始終使用同一塊內存,而使用實例的方式會創建多個內存。
靜態方法是一種特殊的成員方法,它不屬于類的某一個具體的實例,而是屬于類本身,所以在外部調用靜態方法時,可以使用"類名.方法名"的方式,也可以使用"對象名.方法名"的方式。而實例方法只有后面這種方式。也就是說,調用靜態方法可以無需創建對象。
靜態方法只能訪問靜態成員,實例方法可以訪問靜態和實例成員。之所以不允許靜態方法訪問實例成員變量,是因為static方法是類中的一個成員方法是屬于整個類,實例成員變量是屬于某個對象的,而靜態方法在執行時,并不一定存在對象。同樣,因為實例方法可以訪問實例成員變量,如果允許靜態方法調用實例方法,將間接地允許它使用實例成員變量,所以它也不能調用實例方法。static內部只能出現static變量和其他static方法,而且static方法中不能使用this關鍵字,因為它是屬于整個類的。main()方法是一個典型的靜態方法,它同樣遵循一般靜態方法的規則,所以它可以由系統在創建對象之前就調用。
那么在程序中什么地方可以利用靜態字段和靜態構造方法:通常適用于于一些不會經常變化而又頻繁使用的數據,比如連接字符串,配置信息等,當滿足上面所 說的兩點時,進行一次讀取,以后就可以方便的使用了,同時也節約了托管資源,因為對于靜態成員,一個靜態字段只標識一個存儲位置。對一個類無論創建了多少 個實例,它的靜態字段永遠都只有一個副本(副本我理解為只有一塊內存靜態成員存在于內存,非靜態成員需要實例化才會分配內存)。 公用的處理函數,使用靜態方法應該沒有問題..牽涉到數據共享,靜態變量的函數要多考慮...靜態變量要小心使用..靜態方法 原理就是共享代碼段 共享代碼段不會產生任何問題 因為代碼段都是給CPU作為"讀取"用的,除非你進行惡意"修改"運行時的代碼段 所以靜態方法是可以放心使用的靜態變量 原理就是共享數據段 同上 只要沒有進行"寫入"操作就不會產生問題 但是數據通常都是用于讀和寫 所以靜態變量要注意使用
常見的一些誤區【摘自下面鏈接】
http://idai.blogbus.com/logs/7078424.html
1、大家都以為“ 靜態方法常駐內存,實例方法不是,所以靜態方法效率高但占內存。”
事實上,他們都是一樣的,在加載時機和占用內存上,靜態方法和實例方法是一樣的,在類型第一次被使用時加載。調用的速度基本上沒有差別。
2、大家都以為“ 靜態方法在堆上分配內存,實例方法在堆棧上”
事實上所有的方法都不可能在堆或者堆棧上分配內存,方法作為代碼是被加載到特殊的代碼內存區域,這個內存區域是不可寫的。
方法占不占用更多內存,和它是不是static沒什么關系。
因為字段是用來存儲每個實例對象的信息的,所以字段會占有內存,并且因為每個實例對象的狀態都不一致(至少不能認為它們是一致的),所以每個實例對象的所以字段都會在內存中有一分拷貝,也因為這樣你才能用它們來區分你現在操作的是哪個對象。
但方法不一樣,不論有多少個實例對象,它的方法的代碼都是一樣的,所以只要有一份代碼就夠了。因此無論是static還是non-static的方法,都只存在一份代碼,也就是只占用一份內存空間。
同樣的代碼,為什么運行起來表現卻不一樣?這就依賴于方法所用的數據了。主要有兩種數據來源,一種就是通過方法的參數傳進來,另一種就是使用class的成員變量的值……
3、大家都以為“實例方法需要先創建實例才可以調用,比較麻煩,靜態方法不用,比較簡單”
事實上如果一個方法與他所在類的實例對象無關,那么它就應該是靜態的,而不應該把它寫成實例方法。所以所有的實例方法都與實例有關,既然與實例有關,那么創建實例就是必然的步驟,沒有麻煩簡單一說。
當然你完全可以把所有的實例方法都寫成靜態的,將實例作為參數傳入即可,一般情況下可能不會出什么問題。
從面向對象的角度上來說,在抉擇使用實例化方法或靜態方法時,應該根據是否該方法和實例化對象具有邏輯上的相關性,如果是就應該使用實例化對象 反之使用靜態方法。這只是從面向對象角度上來說的。
如果從線程安全、性能、兼容性上來看 也是選用實例化方法為宜。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。