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