關於c#靜態方法和執行個體方法的辨析和應用

來源:互聯網
上載者:User

本文將圍繞c#靜態方法和執行個體方法討論一下。針對一些觀點,如:"靜態方法是常駐記憶體", 還有"靜態方法比執行個體方法先裝載",做一個辨析。同時討論下何時用靜態方法,何時用執行個體方法。

 

前幾日,在微軟的好友發給我一個連結:《靜態方法和執行個體化方法之間的區別你知道了嘛? 歡迎討論!! - 問題最終 ...》,然後說這裡某些觀點需要澄清一下,希望我寫一篇blog。我當時讀了這篇blog. 文比較短,列舉了靜態方法和執行個體方法的幾種案例,也沒有論點,然後就請大家討論。後面評論就比blog熱鬧多了。言辭也激烈,後來該blog作者乾脆把這篇blog刪了。現在已經看不到這篇blog了。現在我寫這篇blog,一是針對一些觀點做個辨析,二是完成好友的所託。

 

c#靜態方法和執行個體方法的幾種用法

 

見如下代碼:這三種形式我們應該都用過。

public class SomeClass{    private string myfield = null;    public static instance = new SomeClass();    public instranceMethod() {};    public static staticMethod() {};}public class AnotherClass{    public static Main()    {        //第一種方式, 聲明執行個體,調用執行個體方法      SomeClass someClass = new SomeClass();         someClass.instanceMethod();        //第二種方式,通過一個靜態執行個體,去調用執行個體方法      SomeClass.instance.instanceMethod();        //第三種方式,直接調用靜態方法      SomeClass.staticMethod();    }}

 

這幾種方式在調用時間,還有安全執行緒,物件導向的編程方面都有差別。後文會談到。

 

"靜態方法是常駐記憶體"

 

這是那位blog作者在評論中給出的觀點。我覺得"靜態方法是常駐記憶體"的說法是不對的。要知道一個.net類型的靜態方法是屬於這個.net類型的。而這個.net類型是一個.net 程式集的一部分。這個.net程式集是被一個AppDomain裝入到記憶體裡面來的。這個AppDomain是可以從記憶體卸載的。一個有.net CLR的進程裡面可以有多於一個的AppDomain,第一個AppDomain之後的AppDomain都可以動態建立和卸載。這些AppDomain中的.net程式集,既可以有靜態方法,也可以有執行個體方法。不管是靜態方法還是執行個體方法,都是隨其程式集所在的AppDomain一起建立和卸載。第一個AppDomain在整個程式運行結束時也會最後被卸載。其中所含的.net程式集自然也卸載。看圖1會更明白點。所以靜態方法不存在常駐記憶體一說。

圖1

 

 

"靜態方法比執行個體方法先裝載"

 

這也是那篇blog的評論中某些人提出的觀點。我不知道他們的論據是什麼,但是我已經做過實驗,而且也寫過這兩篇blog關於.net反射和metadata載入--致Jeffray Zhao等幾位和firelong和[繼續討論]關於Windows PE和.net assembly的載入來證明.net程式集的載入方式是整個地載入,而不是用到某個metadata才載入該metadata, 用到某個方法才載入該方法。因為靜態方法和執行個體方法同屬於一個.net類型,而一個.net類型屬於一個.net程式集。在整個地載入一個.net程式集的時候,不管是靜態方法還是執行個體方法,都隨該程式集全部載入進記憶體。所以"靜態方法比執行個體方法先裝載"也是不成立的。

 

何時用靜態方法,何時用執行個體方法

 

先說執行個體方法,當你給一個類寫一個方法,如果該方法需要訪問某個執行個體的成員變數時,那麼就將該方法定義成執行個體方法。一類的執行個體通常有一些成員變數,其中含有該執行個體的狀態資訊。而該方法需要改變這些狀態。那麼該方法需要聲明成執行個體方法。

 

靜態方法正好相反,它不需要訪問某個執行個體的成員變數,它不需要去改變某個執行個體的狀態。我們把該方法定義成靜態方法。

 

第一種方式, 聲明執行個體,調用執行個體方法

 

當一個類有多個執行個體,例如學生這個類,執行個體可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多線程的情況下,只要每個線程都建立自己的執行個體,那麼第一種方法通常是安全執行緒的。

 

第二種方式,通過一個靜態執行個體,去調用執行個體方法

這種情況比較特殊,通常是整個程式裡該類唯一的一個執行個體,我們通過調用該執行個體的執行個體方法來改變該執行個體的某些狀態。這一個執行個體在多線程的情況下,通常是線程不安全的。除非我們給這個執行個體加鎖。防止其他線程訪問該執行個體。

 

第三種方式,直接調用靜態方法

 

這種情況下靜態方法不需要去改變某個執行個體的狀態。只要得到少量的參數就可完成既定事情。比如判斷一個檔案是否存在,只要給個檔案路徑和檔案名稱,就能知道該檔案是否存在。

 

學識有限,敬請您指教。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.