本文将圍繞c#靜态方法和執行個體方法讨論一下。針對一些觀點,如:"靜态方法是常駐記憶體", 還有"靜态方法比執行個體方法先裝載",做一個辨析。同時讨論下何時用靜态方法,何時用執行個體方法。
前幾日,在微軟的好友發給我一個連結:《靜态方法和執行個體化方法之間的差別你知道了嘛? 歡迎讨論!! - 問題最終 ...》,然後說這裡某些觀點需要澄清一下,希望我寫一篇blog。我當時讀了這篇blog. 文比較短,列舉了靜态方法和執行個體方法的幾種案例,也沒有論點,然後就請大家讨論。後面評論就比blog熱鬧多了。言辭也激烈,後來該blog作者幹脆把這篇blog删了。現在已經看不到這篇blog了。現在我寫這篇blog,一是針對一些觀點做個辨析,二是完成好友的所托。
c#靜态方法和執行個體方法的幾種用法
見如下代碼:這三種形式我們應該都用過。
這幾種方式在調用時間,還有線程安全,面向對象的程式設計方面都有差别。後文會談到。
"靜态方法是常駐記憶體"
這是那位blog作者在評論中給出的觀點。我覺得"靜态方法是常駐記憶體"的說法是不對的。要知道一個.net類型的靜态方法是屬于這個.net類型的。而這個.net類型是一個.net 程式集的一部分。這個.net程式集是被一個AppDomain裝入到記憶體裡面來的。這個AppDomain是可以從記憶體解除安裝的。一個有.net CLR的程序裡面可以有多于一個的AppDomain,第一個AppDomain之後的AppDomain都可以動态建立和解除安裝。這些AppDomain中的.net程式集,既可以有靜态方法,也可以有執行個體方法。不管是靜态方法還是執行個體方法,都是随其程式集所在的AppDomain一起建立和解除安裝。第一個AppDomain在整個程式運作結束時也會最後被解除安裝。其中所含的.net程式集自然也解除安裝。看圖1會更明白點。是以靜态方法不存在常駐記憶體一說。

圖1
"靜态方法比執行個體方法先裝載"
何時用靜态方法,何時用執行個體方法
先說執行個體方法,當你給一個類寫一個方法,如果該方法需要通路某個執行個體的成員變量時,那麼就将該方法定義成執行個體方法。一類的執行個體通常有一些成員變量,其中含有該執行個體的狀态資訊。而該方法需要改變這些狀态。那麼該方法需要聲明成執行個體方法。
靜态方法正好相反,它不需要通路某個執行個體的成員變量,它不需要去改變某個執行個體的狀态。我們把該方法定義成靜态方法。
第一種方式, 聲明執行個體,調用執行個體方法
當一個類有多個執行個體,例如學生這個類,執行個體可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多線程的情況下,隻要每個線程都建立自己的執行個體,那麼第一種方法通常是線程安全的。
第二種方式,通過一個靜态的執行個體,去調用執行個體方法
這種情況比較特殊,通常是整個程式裡該類唯一的一個執行個體,我們通過調用該執行個體的執行個體方法來改變該執行個體的某些狀态。這一個執行個體在多線程的情況下,通常是線程不安全的。除非我們給這個執行個體加鎖。防止其他線程通路該執行個體。
第三種方式,直接調用靜态方法
這種情況下靜态方法不需要去改變某個執行個體的狀态。隻要得到少量的參數就可完成既定事情。比如判斷一個檔案是否存在,隻要給個檔案路徑和檔案名,就能知道該檔案是否存在。
學識有限,敬請您指教。