靜態構造函數是在構造函數方法前面添加了static關鍵字之后形成的,並且沒有修飾符(public,private),沒有參數。
特點:
1、靜態構造函數沒有修飾符修飾(public,private),因為靜態構造函數不是我們程序員調用的,是由.net 框架在合適的時機調用的。
2、靜態構造函數沒有參數,因為框架不可能知道我們需要在函數中添加什么參數,所以規定不能使用參數。
3、靜態構造函數前面必須是static 關鍵字。如果不加這個關鍵字,那就是普通的構造函數了。
4、靜態構造函數中不能實例化實例變量。(變量可以分為類級別和實例級別的變量,其中類級別的有static關鍵字修飾)。
5、靜態函數的調用時機,是在類被實例化或者靜態成員被調用的時候進行調用,並且是由.net框架來調用靜態構造函數來初始化靜態成員變量。
6、一個類中只能有一個靜態構造函數。
7、無參數的靜態構造函數和無參數的構造函數是可以並存的。因為他們一個屬於類級別,一個屬於實例級別,並不沖突。
8、靜態構造函數只會被執行一次。並且是在特點5中的調用時機中進行調用。
9、如果沒有在類中寫構造函數,那么框架會為我們生成一個構造函數,那么如果我們在類中定義了靜態變量,但是又沒有定義靜態構造函數,那么框架也會幫助我們來生成一個靜態構造函數來讓框架自身來調用。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class A { static A() { Console.WriteLine("1"); } public A() { Console.WriteLine("2"); } } class B:A { static B() { Console.WriteLine("a"); } public B() { Console.WriteLine("b"); } } class Program { static void Main(string[] args) { //a 1 2 b A ab = new B(); Console.WriteLine("--------"); //2 b ab = new B(); Console.ReadKey(); } } }
執行結果:
1、A ab = new B();
A. 實例化B, 執行B的靜態構造函數 == 輸出`a`
B. 執行B的構造函數,因為B繼承自A,所以先進入A
C. 實例化A, 執行A的靜態構造函數,== 輸出 `1`
D. 執行A的構造函數 ==輸出`2`
E. 最后回到B的構造函數 == 輸出`b`
2、ab = new B();
因為靜態構造函數只創建一次,所以不會進入靜態構造函數
A. 因為B繼承自A,所以先進入A的構造函數 == 輸出`2`
B. 再進入B的構造函數 == 輸出`b`
原文鏈接:https://blog.csdn.net/hyunbar/article/details/81171335