天天看點

C#靜态和非靜态的差別

C#的類中可以包含兩種方法:C#靜态方法與非靜态方法。那麼他們的定義有什麼不同呢?他們在使用上會有什麼不同呢?讓我們來看看最直覺的差别:使用了static 修飾符的方法為靜态方法,反之則是非靜态方法。

比較一、C#靜态成員:

靜态成員屬于類所有,非靜态成員屬于類的執行個體所有。

每建立一個類的執行個體,都會在記憶體中為非靜态成員新配置設定一塊存儲;靜态成員屬于類所有,為各個類的執行個體所公用,無論類建立了多少執行個體,類的靜态成員在記憶體中隻占同一塊區域。

比較二、C#靜态方法

C#靜态方法屬于類所有,類執行個體化前即可使用。

非靜态方法可以通路類中的任何成員,靜态方法隻能通路類中的靜态成員。因為靜态方法在類執行個體化前就可以使用,而類中的非靜态變量必須在執行個體化之後才能配置設定記憶體,這樣,C#靜态方法調用時無法判斷非靜态變量使用的記憶體位址。是以無法使用。而靜态變量的位址對類來說是固定的,故可以使用。

比較三、C#靜态方法是一種特殊的成員方法

它不屬于類的某一個具體的執行個體,而是屬于類本身。是以對靜态方法不需要首先建立一個類的執行個體,而是采用類名.靜态方法的格式 。

static内部隻能出現static變量和其他static方法!而且static方法中還不能使用this....等關鍵字..因為它是屬于整個類!

靜态方法效率上要比執行個體化高,靜态方法的缺點是不自動進行銷毀,而執行個體化的則可以做銷毀。

靜态方法和靜态變量建立後始終使用同一塊記憶體,而使用執行個體的方式會建立多個記憶體。

比較四、C#靜态方法中擷取類的名稱

靜态方法中用:

string className =   System.Reflection.MethodBase. GetCurrentMethod().ReflectedType.FullName; 

非靜态方法中還可以用:

string className = this.GetType().FullName; 

使用靜态得準則就是:1.保證不會産生并發。2. 在友善快捷和開發難度上做一個衡量

轉載于:https://www.cnblogs.com/zhxhdean/archive/2011/04/21/2023250.html

繼續閱讀