事情是這樣的
朋友是一個一年多經驗的.Net開發人員
在面試新公司的時候,被面試官問到什么是"靜態構造函數"
朋友回來告訴我,
"構造函數還有靜態的嗎,看來這次面試要黃了"
"對的,構造函數是有靜態的啊,不過也難怪,很少人會用到,看來面試官是要看你的基礎有多深啊!"
靜態構造函數
我們知道,所有的靜態成員,包括靜態字段和靜態方法,當程序運行遇到這些靜態成員所在的類
在創建對象或者調用靜態成員的時候,所有的靜態成員會加載到內存的靜態存儲區,這個存儲區
與棧、堆分開,所以我們可以直接用
類名.靜態成員的方式對靜態成員進行訪問,不受對象控制.
同理.靜態構造函數也是當程序運行到這個靜態構造函數所在的類在創建對象或者調用靜態成員的時候,這個靜態構造函數就被"執行"
1 //聲明一個Person類 2 class Person 3 { 4 static Person() 5 { 6 Console.WriteLine("這里是靜態構造函數"); 7 } 8 public Person() 9 { 10 Console.WriteLine("這里是無參構造函數"); 11 } 12 }
調用Main()方法
1 static void Main(string[] args) 2 { 3 Person p=new Person() ; 4 5 Console.ReadKey(); 6 }
結果:
所以,靜態構造函數是先於任何構造函數執行的
靜態構造 函數不允許有訪問修飾符如:public
那么,我們可以利用靜態構造函數做什么呢?
1.利用靜態構造函數對靜態字段初始化,或調用靜態方法
1 //聲明一個Person類 2 class Person 3 { 4 private static readonly int age; 5 6 static Person() 7 { 8 age = 18; 9 Console.WriteLine("這里是靜態構造函數"); 10 SayHi(); 11 } 12 static void SayHi() 13 { 14 Console.WriteLine("你好,我是靜態方法,年齡是"+age); 15 } 16 }
這里,將方法和字段私有化,外部不能直接用類名. 出來,所以很好的利用的靜態構造函數的作用 (雖然也可以封裝成一個公共方法來訪問)
還是調用上面的Main()函數
2.利用靜態構造函數實現單例模式
由於涉及設計模式,這里只介紹靜態構造函數所發揮的作用,讀者有興趣可以自行查閱相關資料了解單例模式
1 //聲明一個Person類 2 class Person 3 { 4 private static readonly Person per; 5 6 public static int age; 7 static Person() 8 { 9 per = new Person(); 10 Console.WriteLine("這里是靜態構造函數"); 11 } 12 private Person() 13 { 14 Console.WriteLine("這里是無參構造函數"); 15 } 16 }
1 static void Main(string[] args) 2 { 3 Person.age=18 ; 4 5 Console.ReadKey(); 6 }
結果:
①把默認的構造函數私有化private,因此外部不能再new出一個對象,若要創建對象,只能由自己創建自己
②為了觸發靜態構造函數來創建對象. 外部調用了一個靜態字段,由此靜態構造函數被觸發
③由於靜態構造函數只能被發動一次,所以創建的對象也只有一個
最后,如果我們要在外部訪問這個被靜態構造函數初始化的對象,那么我們可以在Person類中加入這個方法
1 public static Person GetInstance() 2 { 3 return per; 4 }
其實靜態構造函數的用途並不廣,我們不能為了用它而用它,
使用static之前要考慮清楚,因為它會提前占用系統資源,
雖說這里將靜態構造函數,大家覺得可能對業務沒什么幫助,的確
但是,我們更要做一名專業的程序員\軟件工程師 起碼被問到也可以自信地回答
本人對C#語法有濃厚的興趣,歡迎大家關注我一起討論C#語法