您好,登錄后才能下訂單哦!
本篇內容主要講解“C#如何構造函數”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C#如何構造函數”吧!
CLR Via C#中構造函數是可以將類型實例初始化為有效狀態的特殊方法。構造函數在元數據中通常用.ctor來表示,通過IL代碼可以看到。在創建一個類型的實例時,通常分為三步:
1 為實例的數據字段分配內存。
2 創建對象指針和同步索引塊。
3 調用類型的實例構造器來設置對象的初始狀態。
CLR Via C#中引用類型的實例構造器
在創建一個引用類型的對象是,調用類型的實例構造函數之前,會將對象分配的內存做清零處理,就是說在構造函數中沒有顯示賦值的所有字段都將設置為0或null。
實例構造函數和一般方法不同,他永遠都不能被繼承,所有以下的關鍵字也不能用于實例構造函數(virtual new override sealed abstract)。
一個類中如果沒有顯示定義任何構造函數,C#編譯器將定義一個默認的無參構造函數。
抽象(abstract)類的默認構造函數的訪問修飾符為protected。
構造函數可以初始化字段,不過在c#語言中提供了一種簡單的方法,在定義字段的時候直接賦值以初始化。如下:
public class User2 { private int _age = 25; private string _name = "oec2003"; }
像上面那樣的確很方便,但如果有好幾個已經初始化的實例字段和多個重載的構造函數同時存在的情況下,就應該將實例字段的初始化放到一個公共的構造函數中,其他的構造函數通過this來顯示調用該構造函數,這樣可以減少代碼生成的大小,看下面的例子。
public abstract class User { private int _age=25; private string _name="oec2003"; private string _email = "oec2003@gmail.com"; public User(Int32 age) { this._age = age; } public User(string name) { this._name = name; } public User(Int32 age, String name, String email) { this._age = age; this._name = name; this._email = email; }
正確的寫法應該像下面這樣
public abstract class User { private int _age; private string _name; private string _email; public User() { _age=25; _name="oec2003"; _email = "oec2003@gmail.com"; } public User(Int32 age):this() { this._age = age; } public User(string name):this() { this._name = name; } public User(Int32 age, String name, String mail):this() { this._age = age; this._name = name; this._email = email; } }
CLR Via C#中值類型的實例構造函數
值類型的實例構造函數和引用類型的有很大不同,在值類型中不能含有無參的構造函數,如果顯式指定無參的構造函數將會出現編譯錯誤。如下面代碼會出現編譯錯誤:
struct User { public Int32 _age; public String _name; public User() { _age = 25; _name = "oec2003"; } }
值類型不能包含無參的構造函數,也不能在值類型中給字段進行初始化,下面的代碼也將不能通過編譯。
public struct User { public Int32 _age=25; public String _name="oec2003"; }
在值類型中也可以有構造函數,不過該構造函數必須含有參數,而且要初始化所有的字段。含有參數但沒有初始化所有字段的構造函數也不能通過編譯。看下面代碼:由此可見如果值類型中顯示包含構造函數必須要初始化所有的字段。
如果有多個構造函數,每個構造函數也必須保證初始化所有的字段,否則不能通過編譯。如果值類型中不包含構造函數,實例化時所有字段將設置為0或null。
public struct User { public Int32 _age; public String _name; //只初始化了_age public User(Int32 age) { _age = age; } public User(Int32 age,String name) { _age = age; _name = name; } }
CLR Via C#中類型構造函數
類型構造函數也被稱為靜態構造函數。靜態構造函數可以用于引用類型和值類型。和實例構造函數不同的是靜態構造函數在一個類型中永遠只有一個,并且不能包含參數。靜態構造函數中只能初始化靜態字段。
下面代碼分別展示在值類型(和實力構造函數不同,值類型中允許顯示定義無參的靜態構造函數)和引用類型中的靜態構造函數。
//值類型 public struct User { public static Int32 _age ; public static String _name; static User() { _age = 25; _name = "oec2003"; } } //引用類型 public class User { public static Int32 _age ; public static String _name; static User() { _age = 25; _name = "oec2003"; } }
為了防止開發人員編寫的代碼調用靜態構造函數,C#編譯器會將靜態構造函數定義為私有(private)的,并且不能顯示地給靜態構造函數添加訪問修飾符,如果這么做了會出現編譯錯誤。
上面講到過在值類型中不能在定義是給實例字段賦值,否則會編譯錯誤,但可以在定義時給靜態字段賦值,看下面代碼:
public struct User { public static Int32 _age = 25; //正確 可以初始化靜態字段 public String _name = "oec2003"; //錯誤 不能初始實例字段 }
CLR Via C#中靜態構造函數不應該去調用基類的靜態構造函數,因為靜態字段是不會被繼承到子類中,所以這樣做沒有意義。
到此,相信大家對“C#如何構造函數”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。