建構函式
建構函式分為:例項建構函式,靜態建構函式,私有建構函式。
1、建構函式的名字與類名相同。
2、使用 new 表示式建立類的物件或者結構(例如int)時,會呼叫其建構函式。並且通常初始化新物件的資料成員。
3、除非類是靜態的,否則會為沒有建構函式的類,自動生成乙個預設建構函式,並使用預設值來初始化物件字段。
4、建構函式可以有引數,可以以多型的形式存在多個建構函式。
例:
class其中coords()是建構函式,諸如此類不帶引數的建構函式稱為「預設建構函式」。coords
//具有兩個引數的建構函式
public coords(int x, int
y)
//重寫tostring方法
public
override
string
tostring()
,)", x, y));
}static
void
main(string args)
", p1);
console.writeline(
"coords #2 at
", p2);
console.readkey();
}}/*
output:
coords #1 at (0,0)
coords #2 at (5,3)
*/
coords(int x, int y)同樣也是建構函式,建構函式可以有引數,允許多型。
靜態建構函式具有以下屬性:
建構函式與靜態建構函式:
classmain是程式入口,當執行main的時候,最先執行public static int x = 0testclass
//靜態建構函式
static
testclass()
//第一步,程式入口main最先執行。然後執行public static int x = 0 接著執行靜態建構函式。
public
static
void main(string
args)
", x); //列印,x = 2
testclass test = new
testclass();//第三步執行建構函式,此時x = 1
console.writeline("x:
", x); //列印 x = 1
console.read();}}
接著執行靜態建構函式,此時 x = 2
然後執行main函式裡面的內容,列印 x,此時 x = 2
初始化testclass,然後會執行建構函式,此時 x = 1
列印 x = 1
那麼,在呼叫某類的靜態函式時真正的執行順序:
1、靜態變數 > 靜態建構函式 > 靜態函式
2、靜態變數 > 靜態建構函式 > 建構函式
c#高效程式設計改進c#**的50個行之有效的辦法(第2版)裡說到這樣一段話:
型別例項的完整過程。你需要理解這些操作的順序,以及物件的預設初始化操作。你要保證在構造的過程中對每個成員變數僅初始化一次。實現這一點最好的方法就是,盡可能的早地進行初始化。練習題:(core專案下,答案不同)下面就是建立某個型別的第乙個例項時,所進行的操作順序為:
(1)靜態變數設定為0
(2)執行靜態變數初始化器
(3)執行基類的靜態建構函式
(4)執行靜態建構函式
(5)例項變數設定為0
(6)執行衯變數初始化器
(7)執行基類中合適的例項建構函式
(8)執行例項建構函式
同樣型別的第二個以及以後的例項將從第5步開始執行,因為類的構造器僅會執行一次。此外,第6步和第7步將被優化,以便建構函式初始化器使編譯器移除重複的指令。
public下面公布答案:classa}
public
class
b,y:。
", a.x, y);
console.readline();}}
public練習題答案classa}
public
class
b,y:。
", a.x, y);
console.readline();}}
詳細解答:
1、首先,每乙個專案有且只能有乙個靜態類的main函式作為入口函式。而入口函式是最先執行的。
2、由於main函式在b類裡面,首先會初始化b類。而類的初始化順序是:類裡的靜態變數,然後執行靜態建構函式。
3、執行起先執行 public static int y = a.x + 1 這個,執行的時候,會先把 y 初始化為0,然後計算 y 的值。
4、計算 y 的值的時候,呼叫了 a 的靜態變數 x 。所以會先初始化a。
5、初始化a時首先去執行 public static readonly int x ,先把 x 初始化為0。
6、然後執行a的靜態建構函式 x = b.y + 1 此時 y 已經初始化為0了。
7、計算得到 x = 1。然後回到 public static int y = a.x + 1 得到 y = 2。
8、然後再執行main函式的內容。得出結果x=1,y=2
補充: 小鵬y 提出了 .net core 專案下得出的答案有出入。非常感謝他!以下是 .net core 專案的角度
在第二步計算 x = b.y + 1,b.y 的值是1,不是0。 所以在計算 x = b.y + 1 的時候,x = 2。
最後的結果變成:a.x = 2,y = 1
具體為何這樣,還不清楚,此篇文章目前只考慮非 core 專案的情況。
私有建構函式是一種特殊的例項建構函式。 它通常用於只包含靜態成員的類中。 如果類具有乙個或多個私有建構函式而沒有公共建構函式,則其他類(除巢狀類外)無法建立該類的例項。
public宣告空建構函式可阻止自動生成預設建構函式。class
privateconstructor
public
class
privatetest
static
void main(string
args)
", p.i); //結果:i:3
console.read();}}
}
請注意,如果不對建構函式使用訪問修飾符,則在預設情況下它仍為私有建構函式。
但是,通常會顯式地使用 private 修飾符來清楚地表明該類不能被例項化。
例項:
其中單例模式就用到了私有建構函式的特性來保證類不會被例項化。c# 單例模式
C 建構函式總結
c 建構函式的知識在各種c 教材上已有介紹,不過初學者往往不太注意觀察和總結其中各種建構函式的特點和用法,故在此我根據自己的c 程式設計經驗總結了一下c 中各種建構函式的特點,並附上例子,希望對初學者有所幫助。c 類的建構函式詳解 一 建構函式是幹什麼的 class counter private ...
C 建構函式總結
c 提供了建構函式來處理物件的初始化。建構函式是一種特殊的成員函式,與其他成員函式不同,建構函式不需要使用者來呼叫它,而是建立物件時自動執行。建構函式的名字必須與類名相同,建構函式不具有任何型別,不返回任何值 與void型別不同,不是返回空,而是沒有返回值 include using namespa...
C 建構函式總結
建構函式要點 1 建構函式具有與類相同的名稱 2 任何時候,只要建立類或結構,就會呼叫它的建構函式。3 建構函式最大作用 建構函式使得程式設計師可設定預設值 限制例項化 用private 以及編寫靈活且便於閱讀的 4 如果沒有為物件提供建構函式,則預設情況下 c 將建立乙個建構函式,而且變數都為預設...