深入理解C# 靜態類與非靜態類、靜態成員的區別

深入理解C# 靜態類與非靜態類、靜態成員的區別
靜態類

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

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

兩者的區別:
私有構造器方式仍然可以從類的內部對類進行實例化,而靜態類禁止從任何地方實例化類,其中包括從類自身內部。靜態類和使用私有構造器的另一個區別在于,在 使用私有構造器的類中,是允許有實例成員的,而C# 2.0和更高版本的編譯器不允許靜態類有任何實例成員。使用靜態類的優點在于,編譯器能夠執行檢查以確保不致偶然地添加實例成員,編譯器將保證不會創建此 類的實例。靜態類的另一個特征在于,C#編譯器會自動把它標記為sealed。這個關鍵字將類指定為不可擴展;換言之,不能從它派生出其他類。

靜態類的主要特性:
1:僅包含靜態成員。
2:無法實例化。
3:是密封的。
4:不能包含實例構造函數。

靜態成員
1:非靜態類可以包含靜態的方法、字段、屬性或事件;
2:無論對一個類創建多少個實例,它的靜態成員都只有一個副本;
3:靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件,并且不能訪問任何對象的實例變量;
4:靜態方法只能被重載,而不能被重寫,因為靜態方法不屬于類的實例成員;
5:雖然字段不能聲明為 static const,但 const 字段的行為在本質上是靜態的。這樣的字段屬于類,不屬于類的實例。因此,可以同對待靜態字段一樣使用 ClassName.MemberName 表示法來訪問 const 字段;6:C# 不支持靜態局部變量(在方法內部定義靜態變量)。

靜態構造函數
1:靜態類可以有靜態構造函數,靜態構造函數不可繼承;
2:靜態構造函數可以用于靜態類,也可用于非靜態類;
3:靜態構造函數無訪問修飾符、無參數,只有一個 static 標志;
4:靜態構造函數不可被直接調用,當創建類實例或引用任何靜態成員之前,靜態構造函數被自動執行,并且只執行一次。

注意:
1:靜態類在內存中是一直有位置的;
2:非靜態類在實例化后是在內存中是獨立的,它的變量不會重復,在使用后會及時銷毀,所以不會出現未知的錯誤。在C#中靜態成員是比較敏感的東西,在不是十分確認的情況下不要使用;
3:建議更多地使用一般類(非靜態類)。

使用選擇:
當定義的類不需要進行實例化時,我們使用靜態類;如果需要實例化對象,需要繼承等特性時,應該使用非靜態類,并且將統一使用的變量和方法設為靜態的,那么所有實例對象都能訪問。

C# 靜態成員和方法的學習小結

數據成員:
數據成員可以分靜態變量、實例變量兩種.
靜態成員:靜態成員變量是和類相關聯的,可以作為類中"共"有的變量(是一個共性的表現),他不依賴特定對象的存在,訪問的時候通過類名加點操作符加變量名來訪問.

實例成員:實例成員變量是和對象相關聯的,訪問實例成員變量依賴于實例的存在.

函數成員:
方法可以主要分為靜態方法,實例方法

靜態方法:靜態方法是不屬于特定對象的方法,靜態方法可以訪問靜態成員變量,靜態方法不可以直接訪問實例變量,可以在實例函數調用的情況下,實例變 量做為參數傳給靜態方法。靜態方法也不能直接調用實例方法,可以間接調用,首先要創建一個類的實例,然后通過這一特定對象來調用靜態方法。

實例方法:一個實例方法的執行與特定對象關聯,他的執行需要一個對象存在。實例方法可以直接訪問靜態變量和實例變量,實例方法可以直接訪問實例方 法、和靜態方法,靜態方法的訪問方式為類名加點操作符加變量名。當多個實例對象存在時,內存中并不是存在美個特定的實例方法的拷貝,而是,相同類的所有對 象都共享每個實例方法的一個拷貝(實例方法只占用“一套”空間)。

如果將類中的某個成員聲明為static,則稱該成員為靜態成員。一般來說,靜態成員是屬于類所有的,而非靜態成員則屬于類的實例的。每創建一個類的實 例,都在內存中為非靜態成員開辟一片區域。而類的靜態成員為類所有,為這個類的所有實例共享。無論這個類創建了多少副本,一個靜態成員在內存中只占有一塊 區域。

C#類中靜態成員變量的生命周期問題,就是什么時候創建,什么時候銷毀已聲明元素的“生存期”是元素可供使用的時間周期。變量是唯一具有生存期的元 素;為此,編譯器將過程參數和函數返回值視為變量的特殊情況。變量的生存期表示它可以保留值的時間周期。在生存期內變量的值可以更改,但變量總是保留某些 值。

不同的生存期

在模塊級聲明的變量通常在應用程序的整個運行期間都存在。在類或結構中聲明的非共享變量作為聲明它的類或結構的每個實例的單獨副本存在;每個這樣的變量都具有與它的實例相同的生存期。但是,Shared 變量僅有一個生存期,即應用程序運行所持續的全部時間。

用 Dim 聲明的局部變量僅當聲明它們的過程正在執行時存在。這同樣適用于過程的參數和任何函數返回值。但是,如果該過程調用其他過程,則局部變量在被調用過程運行期間保留它們的值。

生存期的開始

當執行到聲明局部變量的過程時,局部變量的生存期開始。過程一開始執行,每個局部變量即被初始化為其數據類型的默認值。數字變量(包括 Byte 和 Char)被初始化為 0,Date 變量初始化為公元 1 年的 1 月 1 日零時,Boolean 變量初始化為 False,引用類型變量(包括字符串、數組和 Object)初始化為 Nothing。

結構變量的每個成員被視為單獨的變量初始化。同樣,數組變量的每個元素也單獨初始化。

如果變量是用初始值設定項聲明的,則在執行變量的聲明語句時,將給該變量分配指定的值,如下面的示例所示:

Dim X As Double = 18.973 ' X had previously been initialized to 0.
在過程的內部塊中聲明的變量在進入該過程時初始化為其默認值。不論該塊是否曾執行過,這些初始化都會生效。

生存期的結束

當過程終止時,不再保留該過程的局部變量值,并回收局部元素所使用的內存。下次執行該過程時,將重新創建它的所有局部元素并初始化局部變量。

當類或結構的實例終止時,它的非共享變量丟失它們的值。類或結構的每個新實例都創建它的所有非共享元素并初始化非共享變量。Shared 元素被一直保留到應用程序停止運行時。

生存期的擴展

如果局部變量是用 Static 關鍵字聲明的,則它的生存期比聲明它的過程的執行時間長。如果該過程在某模塊內,則只要應用程序繼續運行,static 變量就一直存在。

如果 static 變量是在類的內部過程中聲明的,則該變量的生存期取決于此過程是否共享。如果此過程已用 Shared 關鍵字聲明,則變量的生存期將一直延續到應用程序終止時為止。如果此過程為非共享,則其 static 變量為類的實例成員,并且其生存期與類實例的生存期相同。

在下面的示例中,RunningTotal 函數通過將新值添加到存儲在靜態變量 ApplesSold 中的以前值的合計來計算流量合計:

復制代碼 代碼示例:
Function RunningTotal(ByVal Num As Integer) As Integer
Static ApplesSold As Integer
ApplesSold = ApplesSold + Num
Return ApplesSold ' ApplesSold keeps its current value.
End Function

如果沒有使用 Static 就已聲明了 ApplesSold,則在函數調用期間將不保留以前累計的值,并且函數只返回上次用來調用它的相同值。

在模塊級聲明 ApplesSold 可產生相同的生存期。但是,如果這樣更改變量的范圍,此過程將不再擁有對該變量的獨占訪問權。由于其他過程可以訪問該變量并更改它的值,因此流量合計是不可靠的,并且代碼可能會更難維護。

靜態成員在第一次被訪問之前并且在任何靜態構造函數(如調用的話)之前初始化。若要訪問靜態類成員,應使用類名而不是變量名來指定該成員的位置。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容