與包含的類同名的方法,但該方法沒有返回類型:
public class MyClass
{
public MyClass()
{
}
//Rest of class definition
}
如果沒有提供任何構造函數,編譯器會在后台創建一個默認的構造函數。它只能把所有的成員字段初始化為標准的默認值(例如, 引用類型為空引用,數字數據類型為0, bool為false)
如果提供了帶參數的構造函數編譯器就不會自動提供默認的構造函數,只有在沒有定義任何構造函數時,編譯器才會 自動提供默認構造函數。
1. 靜態構造函數
這種構造函數只執行一次,而前面的構造函數是實例構造函數,只要創建類的對象,它都會執行。
class MyClass
{
static MyClass()
{
// initialization code
}
// Rest of class definition
}
編寫靜態構造函數的一個原因是,類有一些靜態字段或屬性,需要在第一次使用類之前,從外部源中初始化這些靜態字段和屬性。
- 靜態構造函數不能帶任何參數,一個類只能有一個靜態構造函數。
- 靜態構造函數沒有訪問修飾符
- 靜態構造函數只能訪問類的靜態成員,不能訪問實例成員。
- 無參數的構造函數盡管參數列表相同,但可以在類中與靜態構造函數共存。因為靜態構造函數是在加載類時執行,而實例構造函數是在創建實例時執行。
假定有 一個用戶設置——BackColor,表示要在應用程序中使用的背景顏色。
namespace ConsoleApplication2
{
classProgram
{
public static readonly Color BackColor;
static Program()
{
DateTime now = DateTime.Now;
if (now.DayOfWeek == DayOfWeek.Saturday || now.DayOfWeek == DayOfWeek.Sunday)
{
BackColor= Color.Green;
}
else
{
BackColor= Color.Red;
}
}
private Program()
{ }
這段代碼說明了顏色設置如何存儲在靜態變量中,該靜態變量在靜態構造函數中進行初始化。把這個字段聲明為只讀類型,表示其值只能在構造函數中設置。
2. 從其他構造函數中調用構造函數
namespace ConsoleApplication3
{
classCar
{
privatestring description;
privateuint nWheels;
public Car(string description, uint nWheels)
{
this.description = description;
this.nWheels = nWheels;
}
// 構造函數初始化器
public Car(string description)
: this(description, 4)
{ }
staticvoid Main(string[] args)
{
}
}
}
C#構造函數初始化符也可以包含對直接基類的構造函數的調用(使用相同的語法,但應用base關鍵字代替this)