天天看點

C#靜态構造函數特點和應用

靜态構造函數

 一:特點

    1:靜态構造函數既沒有通路修飾符,也沒有參數。

    2:如果沒有編寫靜态構造函數,而這時類中包含帶有初始值設定的靜态字段,那麼編譯器會自動生成預設的靜态構造函數。

    3:在建立第一個類執行個體或任何靜态成員被引用時,.NET将自動調用靜态構造函數來初始化類,也就是說我們無法直接調用靜态構造函數,也就無法控制什麼時候執行靜态構造函數了。

    4:如果類中包含用來開始執行的 Main 方法,則該類的靜态構造函數将在調用 Main 方法之前執行。

    5:如果類中的靜态字段帶有初始化,則靜态字段的初始化語句将在靜态構造函數之前運作。

    6:一個類隻能有一個靜态構造函數。

    7:無參數的構造函數可以與靜态構造函數共存。盡管參數清單相同,但一個屬于類,一個屬于執行個體,是以不會沖突。

    8:最多隻運作一次。

    9:靜态構造函數不可以被繼承。

二 :需求

    1.為什麼使用靜态構造函數?

    類有一些靜态字段和屬性,需要在第一次使用類之前,從外部源中初始化這些靜态字段和屬性

    2.靜态構造函數什麼時候執行

    CLR不能确定靜态構造函數什麼時候執行,也不能預計不同類的靜态構造函數按什麼順序執行,但可以明确的是,靜态構造函數之多執行一次,即在引用類之前執行在C#中,靜态構造函數通常在第一次調用類的成員之前執行

    3.靜态構造函數有通路修飾符嗎?

    沒有。因為,C#代碼從不調用它,但在加載類時,總是由,CLR調用它。對于C#來說是私有的吧

    4.靜态構造函數可以有參數嗎?

    不能有參數。

    5.一個類可以有多個靜态構造函數嗎?

    一個類隻能有一個靜态構造函數

    6.靜态構造函數可以通路執行個體成員嗎?

    顯然不能。隻能通路靜态成員

    7.一個類可以同時擁有午餐的靜态構造函數和執行個體構造函數嗎?

    可以。因為,靜态構造函數是在加載類時執行的,而執行個體構造函數是在建立執行個體時執行的,是以兩者不會有沖突

三:示例

    class A

    {

        public static int X;

        static A()             //④   執行完後傳回到③ 

        {

            X = B.Y + 1;

            Console.WriteLine("static   A()");

        }

    }

    class B

    {

        public static int Y = A.X + 1;       //③   調用了A的靜态成員, 

        //     轉到A的靜态構造函數----> 

        static B()             //②   如果帶有初始值設定項的靜态字段, 

        //     執行該類的靜态構造函數時, 

        //     先要按照文本順序執行那些初始值設定項。 

        //     轉到初始值設定項----> 

        {

            Console.WriteLine("static   B()");

        }

        static void Main()           //①   程式入口, 

        //     如果類中包含用來開始執行的   Main   方法, 

        //     該類的靜态構造函數将在調用   Main   方法之前執行。 

        //     轉到B的靜态構造函數----> 

        {

            Console.WriteLine("X   =   {0},   Y   =   {1}", A.X, B.Y);//⑤   輸出結果 

            Console.ReadLine();

        }

    }

    執行結果:X=1;Y=2

繼續閱讀