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