C#調(diào)用構(gòu)造函數(shù)淺析
C#調(diào)用構(gòu)造函數(shù)是如何的呢?讓我們首先來(lái)看看什么是構(gòu)造函數(shù)?
C#調(diào)用構(gòu)造函數(shù)之構(gòu)造函數(shù)定義:它是在創(chuàng)建給定類(lèi)型的對(duì)象時(shí)執(zhí)行的類(lèi)方法。構(gòu)造函數(shù)具有與類(lèi)相同的名稱(chēng),它通常初始化新對(duì)象的數(shù)據(jù)成員。
在下面的示例中,定義了一個(gè)具有一個(gè)簡(jiǎn)單的構(gòu)造函數(shù),名為 Taxi 的類(lèi)。然后使用 new 運(yùn)算符來(lái)實(shí)例化該類(lèi)。在為新對(duì)象分配內(nèi)存之后,new 運(yùn)算符立即調(diào)用 Taxi 構(gòu)造函數(shù)。
C#調(diào)用構(gòu)造函數(shù)實(shí)例
- public class Taxi
 - {
 - public bool isInitialized;
 - public Taxi()
 - {
 - isInitialized = true;
 - }
 - }
 - class TestTaxi
 - {
 - static void Main()
 - {
 - Taxi t = new Taxi();
 - System.Console.WriteLine(t.isInitialized);
 - }
 - }
 
不帶參數(shù)的構(gòu)造函數(shù)稱(chēng)為“默認(rèn)構(gòu)造函數(shù)”。無(wú)論何時(shí),只要使用 new 運(yùn)算符實(shí)例化對(duì)象,并且不為 new 提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。有關(guān)更多信息,請(qǐng)參見(jiàn) 實(shí)例構(gòu)造函數(shù)。
除非類(lèi)是 static 的,否則 C# 編譯器將為無(wú)構(gòu)造函數(shù)的類(lèi)提供一個(gè)公共的默認(rèn)構(gòu)造函數(shù),以便該類(lèi)可以實(shí)例化。有關(guān)更多信息,請(qǐng)參見(jiàn) 靜態(tài)類(lèi)和靜態(tài)類(lèi)成員。
通過(guò)將構(gòu)造函數(shù)設(shè)置為私有構(gòu)造函數(shù),可以阻止類(lèi)被實(shí)例化,如下所示:
C#調(diào)用構(gòu)造函數(shù)實(shí)例
- class NLog
 - {
 - // Private Constructor:
 - private NLog() { }
 - public static double e = System.Math.E; //2.71828...
 - }
 
有關(guān)更多信息,請(qǐng)參見(jiàn) 私有構(gòu)造函數(shù)。
結(jié)構(gòu)類(lèi)型的構(gòu)造函數(shù)與類(lèi)的構(gòu)造函數(shù)類(lèi)似,但是 structs 不能包含顯式默認(rèn)構(gòu)造函數(shù),因?yàn)榫幾g器將自動(dòng)提供一個(gè)構(gòu)造函數(shù)。此構(gòu)造函數(shù)將結(jié)構(gòu)中的每個(gè)字段初始化為 默認(rèn)值表中顯示的默認(rèn)值。然而,只有當(dāng)結(jié)構(gòu)用 new 實(shí)例化時(shí),才會(huì)調(diào)用此默認(rèn)構(gòu)造函數(shù)。例如,下面的代碼使用 Int32 的默認(rèn)構(gòu)造函數(shù),因此您可以確信整數(shù)已初始化:
- int i = new int();
 - Console.WriteLine(i);
 
然而,下面的代碼卻導(dǎo)致了 編譯器錯(cuò)誤 CS0165,因?yàn)樗鼪](méi)有使用 new,而且試圖使用尚未初始化的對(duì)象:
- int i;
 - Console.WriteLine(i);
 
基于 structs 的對(duì)象可以初始化或賦值后使用,如下所示:
- int a = 44; // Initialize the value type...
 - int b;
 - b = 33; // Or assign it before using it.
 - Console.WriteLine("{0}, {1}", a, b);
 
因此對(duì)值類(lèi)型調(diào)用默認(rèn)構(gòu)造函數(shù)不是必需的。
類(lèi)和 structs 都可以定義具有參數(shù)的構(gòu)造函數(shù)。帶參數(shù)的構(gòu)造函數(shù)必須通過(guò) new 語(yǔ)句或 base 語(yǔ)句來(lái)調(diào)用。類(lèi)和 structs 還可以定義多個(gè)構(gòu)造函數(shù),并且二者均不需要定義默認(rèn)構(gòu)造函數(shù)。例如:
C#調(diào)用構(gòu)造函數(shù)實(shí)例
- public class Employee
 - {
 - public int salary;
 - public Employee(int annualSalary)
 - {
 - salary = annualSalary;
 - }
 - public Employee(int weeklySalary, int numberOfWeeks)
 - {
 - salary = weeklySalary * numberOfWeeks;
 - }
 - }
 
此類(lèi)可以使用下列語(yǔ)句中的任一個(gè)來(lái)創(chuàng)建:
C#調(diào)用構(gòu)造函數(shù)實(shí)例
- Employee e1 = new Employee(30000);
 - Employee e2 = new Employee(500, 52);
 
構(gòu)造函數(shù)可以使用 base 關(guān)鍵字來(lái)調(diào)用基類(lèi)的構(gòu)造函數(shù)。例如:
C#調(diào)用構(gòu)造函數(shù)實(shí)例
- public class Manager : Employee
 - {
 - public Manager(int annualSalary)
 - : base(annualSalary)
 - {
 - //Add further instructions here.
 - }
 - }
 
在此示例中,基類(lèi)的構(gòu)造函數(shù)在執(zhí)行構(gòu)造函數(shù)塊之前被調(diào)用。base 關(guān)鍵字可帶參數(shù)使用,也可不帶參數(shù)使用。構(gòu)造函數(shù)的任何參數(shù)都可用作 base 的參數(shù),或用作表達(dá)式的一部分。有關(guān)更多信息,請(qǐng)參見(jiàn) base。
在派生類(lèi)中,如果不使用 base 關(guān)鍵字來(lái)顯式調(diào)用基類(lèi)構(gòu)造函數(shù),則將隱式調(diào)用默認(rèn)構(gòu)造函數(shù)(如果有的話(huà))。這意味著下面的構(gòu)造函數(shù)聲明在效果上是相同的:
C#調(diào)用構(gòu)造函數(shù)實(shí)例
- public Manager(int initialdata)
 - {
 - //Add further instructions here.
 - }
 - public Manager(int initialdata) : base()
 - {
 - //Add further instructions here.
 - }
 
如果基類(lèi)沒(méi)有提供默認(rèn)構(gòu)造函數(shù),派生類(lèi)必須使用 base 顯式調(diào)用基構(gòu)造函數(shù)。
構(gòu)造函數(shù)可以使用 this 關(guān)鍵字調(diào)用同一對(duì)象中的另一構(gòu)造函數(shù)。和 base 一樣,this 可帶參數(shù)使用也可不帶參數(shù)使用,構(gòu)造函數(shù)中的任何參數(shù)都可用作 this 的參數(shù),或者用作表達(dá)式的一部分。例如,可以使用 this 重寫(xiě)前一示例中的第二個(gè)構(gòu)造函數(shù):
- public Employee(int weeklySalary, int numberOfWeeks)
 - : this(weeklySalary * numberOfWeeks)
 - {
 - }
 
上面對(duì) this 關(guān)鍵字的使用導(dǎo)致此構(gòu)造函數(shù)被調(diào)用:
- public Employee(int annualSalary)
 - {
 - salary = annualSalary;
 - }
 
構(gòu)造函數(shù)可以標(biāo)記為 public、 private、 protected、 internal 或 protectedinternal。這些訪(fǎng)問(wèn)修飾符定義類(lèi)的用戶(hù)構(gòu)造該類(lèi)的方式。有關(guān)更多信息,請(qǐng)參見(jiàn) 訪(fǎng)問(wèn)修飾符。
使用 static 關(guān)鍵字可以將構(gòu)造函數(shù)聲明為靜態(tài)構(gòu)造函數(shù)。在訪(fǎng)問(wèn)任何靜態(tài)字段之前,都將自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù),它們通常用于初始化靜態(tài)類(lèi)成員。有關(guān)更多信息,請(qǐng)參見(jiàn) 靜態(tài)構(gòu)造函數(shù)。
C#調(diào)用構(gòu)造函數(shù)的相關(guān)內(nèi)容就向你介紹到這里,希望對(duì)你學(xué)習(xí)和了解C#調(diào)用構(gòu)造函數(shù)有所幫助。
【編輯推薦】















 
 
 
 
 
 
 