程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 深入理解 靜態類和靜態字段(C# 基礎),

深入理解 靜態類和靜態字段(C# 基礎),

編輯:C#入門知識

深入理解 靜態類和靜態字段(C# 基礎),


序言

以前,總是被提醒,在編程過程中盡量少用靜態變量,數據丟失什麼的,今天有空,禁不住對靜態變量的強烈好奇,跟我一起了解下靜態家族的內幕吧。

靜態類

定義

靜態類與非靜態類的重要區別在於靜態類不能實例化,也就是說,不能使用 new 關鍵字創建靜態類類型的變量。在聲明一個類時使用static關鍵字,具有兩個方面的意義:首先,它防止程序員寫代碼來實例化該靜態類;其次,它防止在類的內部聲明任何實例字段或方法。

靜態類是自C# 2.0才引入的,C# 1.0不支持靜態類聲明。程序員必須聲明一個私有構造器。私有構造器禁止開發者在類的范圍之外實例化類的實例。使用私有構造器的效果與使用靜態類的效果非常相似。

私有構造器與靜態類的區別:1)私有構造器方式仍然可以從類的內部對類進行實例化,而靜態類禁止從任何地方實例化類,其中包括從類自身內部;2)在使用私有構造器的類中,是允許有實例成員的,而C# 2.0和更高版本的編譯器不允許靜態類有任何實例成員。

使用靜態類的優點在於,編譯器能夠執行檢查以確保不致偶然地添加實例成員,編譯器將保證不會創建此類的實例。靜態類的另一個特征在於,C#編譯器會自動把它標記為sealed。這個關鍵字將類指定為不可擴展;換言之,不能從它派生出其他類。

靜態類的主要特性:

1.僅包含靜態成員

2.無法實例化

3.是密封的

4.不能包含實例構造函數。

 

 

生命周期

當加載引用靜態類的程序時,.NET Framework 公共語言運行時 (CLR) 將加載該靜態類的類型信息,程序不能指定加載靜態類的確切時間。但是,可以保證在程序中首次引用該類前加載該類,初始化該類的字段並調用其靜態構造函數。 靜態構造函數僅調用一次,在程序駐留的應用程序域的生存期內,靜態類一直保留在內存中。

也就是說,當頁面第一次被訪問的時候,相當於頁面被構造,靜態變量被靜態構造器初始化,然後再次訪問這個頁面的時候,雖然非靜態資源重新被構造,但是此時靜態資源並不被重新構造並一直存在。

 

靜態成員

定義

非靜態類可以包含靜態的方法、字段、屬性或事件。即使沒有創建類的實例,也可以調用該類中的靜態成員。

始終通過類名而不是實例名稱訪問靜態成員。

無論對一個類創建多少個實例,它的靜態成員都只有一個副本。

靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件,並且不能訪問任何對象的實例變量(除非在方法參數中顯式傳遞)

靜態方法可以被重載但不能被重寫,因為它們屬於類,不屬於類的任何實例。

雖然字段不能聲明為 static const,但 const字段的行為在本質上是靜態的。這樣的字段屬於類型,不屬於類型的實例。 因此,可以同對待靜態字段一樣使用 ClassName.MemberName 表示法來訪問 const 字段。不需要對象實例。

C# 不支持靜態局部變量(在方法范圍內聲明的變量)

靜態字段被類的所有實例所共享,即此類的所有實例都訪問同一內存地址。

靜態字段有兩個常見的用法:一是記錄已實例化對象的個數,二是存儲必須在所有實例之間共享的值。

生命周期

靜態成員在第一次被訪問之前並且在調用靜態構造函數(如有存在)之前進行初始化,此後一直保持在內存中,直到應用程序域的生命周期結束。

小結

靜態字段一旦被使用,便會一直存在內存中直到程序生命周期結束。所以使用靜態成員會很占用內存資源。

如果非靜態類中含有靜態成員,則無論類被創建多少次,靜態成員是不變的。

另外,使用靜態類或者靜態成員應該考慮線程安全,即在多線程的情況下靜態資源的占用問題。

參考:http://www.cnblogs.com/devinzhang/archive/2012/02/09/2344105.html


cSharp中靜態、與非靜態在屬性、方法、字段中的作用麻煩舉個例

靜態的在你實例化某對象時值不改變.
非靜態在每次加載或實例化時值會改變.
 

靜態屬性與靜態字段可以訪問獨立於任何對象實例的數據,這裡的對象實例怎理解?

汗。
人家說的獨立於就是說與之無關,即訪問靜態成員或靜態字段不需要建立對象,可以通過類直接調用。也就是“靜態成員是靜態調用的,即無需創建類實例就可調用的,類實例調用的是實例成員”
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved