C# 構(gòu)造函數(shù)

2021-08-03 16:15 更新

C#構(gòu)造函數(shù)

實(shí)例構(gòu)造函數(shù)

構(gòu)造函數(shù)在類或結(jié)構(gòu)體上運(yùn)行初始化代碼。

構(gòu)造函數(shù)被定義為一個(gè)方法。

構(gòu)造函數(shù)具有與類型相同的名稱,并且沒有返回類型:


public class Person {
   string name; // Define field
   public Person (string n){ // Define constructor
      name = n;              // Initialization code
   } 
} 
...
Person p = new Person ("CSS"); // Call constructor 

實(shí)例構(gòu)造函數(shù)允許以下修飾符:

項(xiàng)目修飾符
訪問修飾符public internal private protected
非托管代碼修飾符unsafe extern

重載構(gòu)造函數(shù)

類或結(jié)構(gòu)可能重載構(gòu)造函數(shù)。

為了避免代碼重復(fù),一個(gè)構(gòu)造函數(shù)可以使用this關(guān)鍵字調(diào)用另一個(gè)構(gòu)造函數(shù):


using System; 

public class Product {
   public decimal Price;
   public int Year;
   
   public Product (decimal price) { 
      Price = price; 
   }
   public Product (decimal price, int year) : this (price) { 
     Year = year; 
   } 
} 

當(dāng)一個(gè)構(gòu)造函數(shù)調(diào)用另一個(gè)時(shí),被調(diào)用的構(gòu)造函數(shù)首先執(zhí)行。

我們可以將表達(dá)式傳遞給另一個(gè)構(gòu)造函數(shù),如下所示:


public Product (decimal price, DateTime year) : this (price, year.Year) { 
} 

表達(dá)式本身不能使用這個(gè)引用。


隱式無(wú)參構(gòu)造函數(shù)

對(duì)于類,當(dāng)且僅當(dāng)我們沒有定義任何構(gòu)造函數(shù)時(shí),C#編譯器自動(dòng)生成一個(gè)無(wú)參數(shù)的公共構(gòu)造函數(shù)。

對(duì)于結(jié)構(gòu)體,無(wú)參數(shù)構(gòu)造函數(shù)是struct的固有的;因此,我們不能定義我們自己的無(wú)參數(shù)構(gòu)造函數(shù)。

構(gòu)造函數(shù)和字段初始化順序

我們之前看到字段可以在它們的聲明中用默認(rèn)值初始化:


class Sprite {
   int shields = 50; // Initialized first
   int health = 100; // Initialized second 
} 

字段初始化發(fā)生在執(zhí)行構(gòu)造函數(shù)之前,并且在字段的聲明順序中。

非公共構(gòu)造函數(shù)

構(gòu)造函數(shù)不需要公開。

有一個(gè)非公共構(gòu)造函數(shù)的常見原因是通過(guò)靜態(tài)方法調(diào)用來(lái)控制實(shí)例創(chuàng)建。


public class Class1 { 
    Class1() {} // Private constructor 
    
    public static Class1 Create (...) {
       // call Class1 constructor here
    } 
} 

靜態(tài)構(gòu)造函數(shù)

靜態(tài)構(gòu)造函數(shù)對(duì)每個(gè)類型執(zhí)行一次,而不是每個(gè)實(shí)例執(zhí)行一次。

類型只能定義一個(gè)靜態(tài)構(gòu)造函數(shù),它必須是無(wú)參數(shù)的,并且具有與類型相同的名稱:


class Main {
    static Main () { 
       Console.WriteLine ("Type Initialized"); 
    } 
} 

運(yùn)行時(shí)在所使用的類型之前自動(dòng)調(diào)用靜態(tài)構(gòu)造函數(shù)。

有兩件事情觸發(fā)了:

  • 實(shí)例化類型
  • 訪問類型中的靜態(tài)成員

靜態(tài)構(gòu)造函數(shù)允許的唯一修飾符是unsafe和extern。

靜態(tài)字段初始化器在調(diào)用靜態(tài)構(gòu)造函數(shù)之前運(yùn)行。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)