構造函數、static靜態構造函數(C#特有)、對象初始化語句(C#特有)

        C#中的構造函數與C++中類似,如果希望能從類的外部創建類的實例,需要將構造函數聲明爲public,如果類的聲明中沒有顯式的提供實例構造函數,那麼編譯器會提供一個隱式的默認構造函數,它沒有參數,方法體爲空,如果你爲類聲明瞭任何構造函數,那麼編譯器將不會爲該類定義默認構造函數,這時如果不主動聲明默認構造函數的話,當在使用不帶參數的構造函數創建新的實例時,則會出錯。

靜態構造函數(C++中不存在,C#中存在,可以初始化靜態字段)

構造函數也可以聲明爲static,實例構造函數初始化類的每個新實例,而static構造函數初始化類級別的項,通常,靜態構造函數初始化類的靜態字段

靜態構造函數與實例構造函數的不同:
(1)靜態構造函數聲明中使用static關鍵字
(2)類只能有一個靜態構造函數,而且不能帶參數
(3)靜態構造函數不能有訪問修飾符

靜態構造函數的使用:
(1)類既可以有靜態構造函數也可以有實例構造函數
(2)如同靜態方法,靜態構造函數不能訪問所在類的實例成員,因此也不能使用this訪問器
(3)不能從程序中顯示調用靜態構造函數,系統會自動調用它們在類的任何實例被創建之前、類的任何靜態成員被引用之前,例如new個對象的時候,系統會先調用到靜態構造函數(在已經定義的情況下),然後在調用默認構造函數

    class Program
    {
        static Program()
        {
            Console.WriteLine(999);  //先打印

        }
        public Program()
        {
            Console.WriteLine(100);  //後打印
        }
        static void Main(string[] args)
        {
            Program p = new Program();
        }
    }

對象初始化語句(C++中沒有)

一般情況下,對象創建表達式由關鍵字new後面跟着一個類構造函數及其參數列表組成,對象初始化語句擴展了創建語法,在表達式的尾部放置了一組成員初始化語句,這允許在創建新的對象時,設置字段和屬性的值。,倆種形式,一種包括構造函數的參數列表,一種不包括。

初始化語句發生在構造方法執行之後,因此在構造方法中設置的值會在之後對象初始化中重置爲其他的值

    class Program
    {
        public int a = 1;
        public int b = 2;
        Program()
        {
            a = 11;
            b = 22;
        }
        static void Main(string[] args)
        {
            Program p = new Program();
            Program p2 = new Program { a = 10, b = 20 };
            Console.WriteLine(p.a);  //11
            Console.WriteLine(p.b);  //22
            Console.WriteLine(p2.a); //10
            Console.WriteLine(p2.b); //20
        }
    }

在程序中加斷點調試可以看到在執行p2的構造過程時,先執行的int a=1; int b=2;然後在執行的Program構造函數,最後在進行的對象初始化語句,相當於a、b被賦值了3次,最後的值才爲a=10 b=20

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章