C 建構函式

2021-06-18 14:48:48 字數 3533 閱讀 9878

c#建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.

(1)c#建構函式的名字必須與類同名;

(2)c#建構函式沒有返回型別,它可以帶引數,也可以不帶引數;

(3)c#建構函式的主要作用是完成對類的初始化工作;

(4)在建立乙個類的新物件(使用new關鍵字)時,系統回自動呼叫給類的建構函式初始化新物件;

c#的類有兩種建構函式:例項建構函式和靜態建構函式

c#建構函式之例項建構函式:

負責初始化類中的例項變數,它只有在使用者用new關鍵字為物件分配記憶體時才被呼叫,而且作為引用型別的類,其實例化後的物件必然時分配在託管堆(managed heap)上。例項建構函式又分為預設建構函式和非預設建構函式,注意一旦類有了自己的建構函式,無論是有引數還是沒有引數,預設建構函式都將無效,而且僅僅聲名乙個類而不例項化它,則不會呼叫建構函式。

c#建構函式之靜態建構函式:

(1)用於對靜態字段、唯讀欄位等的初始化;

(2)新增static關鍵字,不能新增訪問修飾符,因為靜態建構函式都是私有的;

(3)類的靜態建構函式在給定應用程式域中至多執行一次,只有建立類的例項或者引用類的任何靜態成員才激發,不能帶又引數;

(4)靜態建構函式是不可繼承的,而且不能被直接呼叫;

(5)如果類中包含用來開始執行的 main 方法,則該類的靜態建構函式將在呼叫 main 方法之前執行.任何帶有初始值設定項的靜態字段,則在執行該類的靜態建構函式時,先要按照文字順序執行那些初始值設定項;

(6)如果沒有編寫靜態建構函式,而這時類中包含帶有初始值設定的靜態字段,那麼編譯器會自動生成預設的靜態建構函式;

乙個類可以同時擁有例項建構函式和靜態建構函式,這是惟一可以具有相同引數列表的同名方法共存的情況。

深入**分析

建構函式是可以將型別例項初始化為有效狀態的特殊方法。建構函式在元資料中通常用.ctor來表示,通過il**可以看到。在建立乙個型別的例項時,通常分為三步:

1 為例項的資料字段分配記憶體。

2 建立物件指標和同步索引塊。

3 呼叫型別的例項構造器來設定物件的初始狀態。

引用型別的例項構造器

在建立乙個引用型別的物件是,呼叫型別的例項建構函式之前,會將物件分配的記憶體做清零處理,就是說在建構函式中沒有顯示賦值的所有欄位都將設定為0或null。

例項建構函式和一般方法不同,他永遠都不能被繼承,所有以下的關鍵字也不能用於例項建構函式(virtual new override sealed abstract)。

乙個類中如果沒有顯示定義任何建構函式,c#編譯器將定義乙個預設的無參建構函式。

抽象(abstract)類的預設建構函式的訪問修飾符為protected。

建構函式可以初始化字段,不過在c#語言中提供了一種簡單的方法,在定義欄位的時候直接賦值以初始化。如下:

1 public class user

2

6

像上面那樣的確很方便,但如果有好幾個已經初始化的例項欄位和多個過載的建構函式同時存在的情況下,就應該將例項欄位的初始化放到乙個公共的建構函式中,其他的建構函式通過this來顯示呼叫該建構函式,這樣可以減少**生成的大小,看下面的例子。

1     public abstract  class user

2     

11

12         public user(string name)

13         

16

17         public user(int32 age, string name, string email)

18         

23      }

正確的寫法應該像下面這樣 

1     public abstract  class user

2     

13

14         public user(int32 age):this()

15         

18

19         public user(string name):this()

20         

23

24         public user(int32 age, string name, string email):this()

25         

30      }

值型別的例項建構函式

值型別的例項建構函式和引用型別的有很大不同,在值型別中不能含有無參的建構函式,如果顯式指定無參的建構函式將會出現編譯錯誤。如下面**會出現編譯錯誤:

1     struct user

2     

11      }

值型別不能包含無參的建構函式,也不能在值型別中給字段進行初始化,下面的**也將不能通過編譯。

1     public struct user

2     

在值型別中也可以有建構函式,不過該建構函式必須含有引數,而且要初始化所有的字段。含有引數但沒有初始化所有欄位的建構函式也不能通過編譯。看如下**:    由此可見如果值型別中顯示包含建構函式必須要初始化所有的字段。如果有多個建構函式,每個建構函式也必須保證初始化所有的字段,否則不能通過編譯。如果值型別中不包含建構函式,例項化時所有欄位將設定為0或null。

1    public struct user

2     

10         public user(int32 age,string name)

11         

15      }

16

17

18

型別建構函式

類 型建構函式也被稱為靜態建構函式。靜態建構函式可以用於引用型別和值型別。和例項建構函式不同的是靜態建構函式在乙個型別中永遠只有乙個,並且不能包含參 數。靜態建構函式中只能初始化靜態字段。下面**分別展示在值型別(和實力建構函式不同,值型別中允許顯示定義無參的靜態建構函式)和引用型別中的靜態構 造函式。 

1     //值型別

2     public struct user

3     

12      }

13     //引用型別

14     public class user

15     

24      }

為了防止開發人員編寫的**呼叫靜態建構函式,c#編譯器會將靜態建構函式定義為私有(private)的,並且不能顯示地給靜態建構函式新增訪問修飾符,如果這麼做了會出現編譯錯誤。

上面講到過在值型別中不能在定義是給例項字段賦值,否則會編譯錯誤,但可以在定義時給靜態字段賦值,看下面**:

1    public struct user

2    

6

靜態建構函式不應該去呼叫基類的靜態建構函式,因為靜態欄位是不會被繼承到子類中,所以這樣做沒有意義。

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 構造器(建構函式)

定義和作用 構造器是在構建類的 引用時 自動執行的方法。所以,每個類都必須至少要有乙個構造器。在訪問乙個類的時候,編譯器最先執行構造器中的 它與類同名,帶引數的構造器能夠獲取引數,但是與方法不同的是 構造器雖然也是一種 例項型別 即必須通過例項來進行呼叫,也可以稱之為引用型別 但是卻不能返回任何值 ...

C 建構函式

建構函式是一種特殊的成員函式,它主要用於為物件分配儲存空間,對資料成員進行初始化.1 建構函式的名字必須與類同名 2 建構函式沒有返回型別,它可以帶引數,也可以不帶引數 3 建構函式的主要作用是完成對類的初始化工作 4 在建立乙個類的新物件 使用new關鍵字 時,系統回自動呼叫給類的建構函式初始化新...