C#的靜態類

靜態類程序員

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

    靜態類是自C# 2.0才引入的,C# 1.0不支持靜態類聲明。程序員必須聲明一個私有構造器。私有構造器禁止開發者在類的範圍以外實例化類的實例。使用私有構造器的效果與使用靜態類的效果很是類似。二者的區別在於,私有構造器方式仍然能夠從類的內部對類進行實例化,而靜態類禁止從任何地方實例化類,其中包括從類自身內部。靜態類和使用私有構造器的另外一個區別在於,在使用私有構造器的類中,是容許有實例成員的,而C# 2.0和更高版本的編譯器不容許靜態類有任何實例成員。使用靜態類的優勢在於,編譯器可以執行檢查以確保不致偶然地添加實例成員,編譯器將保證不會建立此類的實例。靜態類的另外一個特徵在於,C#編譯器會自動把它標記爲sealed。這個關鍵字將類指定爲不可擴展;換言之,不能從它派生出其餘類。this


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


靜態成員.net

1:非靜態類能夠包含靜態的方法、字段、屬性或事件;對象

2:不管對一個類建立多少個實例,它的靜態成員都只有一個副本;blog

3:靜態方法和屬性不能訪問其包含類型中的非靜態字段和事件,而且不能訪問任何對象的實例變量;
4:靜態方法只能被重載,而不能被重寫,由於靜態方法不屬於類的實例成員;
5:雖然字段不能聲明爲 static const,但 const 字段的行爲在本質上是靜態的。這樣的字段屬於類,繼承

   不屬於類的實例。所以,能夠同對待靜態字段同樣使用 ClassName.MemberName 表示法來訪問 const 字段;6:C# 不支持靜態局部變量(在方法內部定義靜態變量)。事件

 

靜態構造函數ip

1:靜態類能夠有靜態構造函數,靜態構造函數不可繼承;

2:靜態構造函數能夠用於靜態類,也可用於非靜態類;

3:靜態構造函數無訪問修飾符、無參數,只有一個 static 標誌;

4:靜態構造函數不可被直接調用,當建立類實例或引用任何靜態成員以前,靜態構造函數被自動執行,而且

   只執行一次。

 

注意:

1:靜態類在內存中是一直有位置的;

2:非靜態類在實例化後是在內存中是獨立的,它的變量不會重複,在使用後會及時銷燬,因此不會出現未知

   的錯誤。在C#中靜態成員是比較敏感的東西,在不是十分確認的狀況下不要使用;

3:建議更多地使用通常類(非靜態類)。

 

使用選擇:

    當定義的類不須要進行實例化時,咱們使用靜態類;若是須要實例化對象,須要繼承等特性時,應該使用非靜態類,而且將統一使用的變量和方法設爲靜態的,那麼全部實例對象都能訪問。

 

 

 

類能夠聲明爲 static 的,以指示它僅包含靜態成員。

靜態類在加載包含該類的程序或命名空間時,由 .NET Framework 公共語言運行庫 (CLR;特指:C#語言) 自動加載。

使用靜態類來包含不與特定對象關聯的方法,具備通用性

注意事項:

(1) 不能使用 new 關鍵字建立靜態類的實例;

(2) 僅包含靜態成員;

(3) 不能被實例化;

(4) 密封的,不能被繼承;

(5) 不能包含實例構造函數,但能夠包含靜態構造函數;

關於靜態構造函數的補充:

(1) 靜態構造函數不可繼承;

(2) 靜態構造函數能夠用於靜態類,也可用於非靜態類;

(3) 靜態構造函數無訪問修飾符、無參數,只有一個 static 標誌;

(4) 靜態構造函數不可被直接調用,當建立類實例或引用任何靜態成員以前,靜態構造函數被自動執行,而且只執行一次。

實例分析:

剛開始對靜態類不太熟悉,因此寫出了以下的代碼:

 

[csharp]  view plain  copy
 
 
 
 
 
  1. public class ClassA  
  2. {  
  3.     public static string AppName = "hello, this is a static class test";  
  4.     public static int num = 5;  
  5.   
  6.     public ClassA()  
  7.     {  
  8.         num = 15;  
  9.     }  
  10.   
  11.     public static int getNum()  
  12.     {  
  13.         return num;  
  14.     }  
  15. }  

在主函數中調用ClassA的靜態方法:

 

 

[csharp]  view plain  copy
 
 
 
 
 
  1. static void Main(string[] args)  
  2. {  
  3.     int num=ClassA.getNum();  
  4.     Console.WriteLine(num);  
  5.     Console.ReadLine();  
  6. }  

最終的輸出結果爲:5

 

緣由分析:

雖然有實例構造函數,但對classA類沒有進行實例化,因此該實例構造函數沒有被調用;

主函數代碼修改以下:

 

[csharp]  view plain  copy
 
 
 
 
 
  1. static void Main(string[] args)  
  2. {  
  3.     ClassA a = new ClassA();  
  4.     int num=ClassA.getNum();  
  5.     Console.WriteLine(num);  
  6.     Console.ReadLine();  
  7. }  

輸出結果爲:15

 

若是類不聲明爲靜態類(static class),很容易出現相似於上面的錯誤。修改成靜態類,代碼以下:

 

[csharp]  view plain  copy
 
 
 
 
 
  1. public static class ClassA  
  2. {  
  3.     public static string AppName = "hello, this is a static class test";  
  4.     public static int num = 5;  
  5.   
  6.     static ClassA()  
  7.     {  
  8.         num = 15;  
  9.     }  
  10.   
  11.     public static int getNum()  
  12.     {  
  13.         return num;  
  14.     }  
  15. }  

 

主函數代碼以下:

 

[csharp]  view plain  copy
 
 
 
 
 
  1. static void Main(string[] args)  
  2. {  
  3.     int num=ClassA.getNum();  
  4.     Console.WriteLine(num);  
  5.     Console.ReadLine();  
  6. }  

因爲靜態構造函數會在調用靜態類的方法時自動調用,因此最終輸出結果正確!

相關文章
相關標籤/搜索