小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

(精)關于c#靜態(tài)方法和實例方法的辨析和應用

 悟靜 2012-04-30

討論下何時用靜態(tài)方法,何時用實例方法。

c#靜態(tài)方法和實例方法的幾種用法,見如下代碼:這三種形式我們應該都用過。

復制代碼
public  class SomeClass
{
private  string myfield =null
;
public  static instance =new
SomeClass();//實例化
public
instranceMethod() {};//第一種
public  static
staticMethod() {};//第二種
}

public  class
AnotherClass//三種
{
publicstatic
Main()
{
//第一種方式, 聲明實例,調用實例方法

SomeClass someClass =new SomeClass();
someClass.instanceMethod();

//第二種方式,通過一個靜態(tài)的實例,去調用實例方法

SomeClass.instance.instanceMethod();

//第三種方式,直接調用靜態(tài)方法

SomeClass.staticMethod();
}
}
復制代碼

  這幾種方式在調用時間,還有線程安全,面向對象的編程方面都有差別。后文會談到。

  "靜態(tài)方法是常駐內存"

  這是那位blog作者在評論中給出的觀點。我覺得"靜態(tài)方法是常駐內存"的說法是不對的。要知道一個.net類型的靜態(tài)方法是屬于這個.net類型的。而這個.net類型是一個.net 程序集的一部分。這個.net程序集是被一個AppDomain裝入到內存里面來的。這個AppDomain是可以從內存卸載的。一個有.net CLR的進程里面可以有多于一個的AppDomain,第一個AppDomain之后的AppDomain都可以動態(tài)創(chuàng)建和卸載。這些AppDomain中的.net程序集,既可以有靜態(tài)方法,也可以有實例方法。不管是靜態(tài)方法還是實例方法,都是隨其程序集所在的AppDomain一起創(chuàng)建和卸載。第一個AppDomain在整個程序運行結束時也會最后被卸載。其中所含的.net程序集自然也卸載。看圖1會更明白點。所以靜態(tài)方法不存在常駐內存一說。

  "靜態(tài)方法比實例方法先裝載"

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

  何時用靜態(tài)方法,何時用實例方法。

  先說實例方法,當你給一個類寫一個方法,如果該方法需要訪問某個實例的成員變量時,那么就將該方法定義成實例方法。一類的實例通常有一些成員變量,其中含有該實例的狀態(tài)信息。而該方法需要改變這些狀態(tài)。那么該方法需要聲明成實例方法。

  靜態(tài)方法正好相反,它不需要訪問某個實例的成員變量,它不需要去改變某個實例的狀態(tài)。我們把該方法定義成靜態(tài)方法

  第一種方式,聲明實例,調用實例方法。

  當一個類有多個實例,例如學生這個類,實例可以有學生甲,學生乙,學生丙,等等,我們就用第一種方式。在多線程的情況下,只要每個線程都創(chuàng)建自己的實例,那么第一種方法通常是線程安全的。

  第二種方式,通過一個靜態(tài)的實例,去調用實例方法。

  這種情況比較特殊,通常是整個程序里該類唯一的一個實例,我們通過調用該實例的實例方法來改變該實例的某些狀態(tài)。這一個實例在多線程的情況下,通常是線程不安全的。除非我們給這個實例加鎖。防止其他線程訪問該實例。

  第三種方式,直接調用靜態(tài)方法。

  這種情況下靜態(tài)方法不需要去改變某個實例的狀態(tài)。只要得到少量的參數就可完成既定事情。比如判斷一個文件是否存在,只要給個文件路徑和文件名,就能知道該文件是否存在。

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多