我們定義了YSchool,YTeacher類,執行個體化對象時:
YSchool shool1 = new YSchool(); shool1.ID = 1; shool1.Name = "清華附中"; YSchool school2 = new YSchool(); school2.ID = 2; school2.Name = "北師大附中";
這樣寫對不對呢,其實在邏輯上是不正確的,因為執行個體化對象時,它的屬性應該是和執行個體化一起就有的,而不是後來再加屬性。在程式中表現就是,屬性要有初值。
所以,在類中就要有這樣一個方法,無傳回型別,方法名和類名相同,有參數類表或者沒有參數列表。它就是構造方法,俗稱“構造器”或“建構函式”。一個類中可以有一個或多個建構函式,當然有時你沒寫建構函式,這並不代表這個類就沒有建構函式,它依然有一個預設的建構函式的。如果使多個建構函式的話,它們各自的參數列表必須不同。
下面以YSchool為例完善這個類。
/// <summary> /// YSchool類的id和name是它的固有屬性,它的值應該是確定的。 /// 執行個體化的同時對屬性賦初值,用到建構函式。 /// </summary> public class YSchool { private int id = 0; private string name = string.Empty; public int ID { get { return this.id; } } public string Name { get { return name; } } /// <summary> /// 沒有參數的構造器稱之為“預設構造器”;如果沒有寫一個構造器,那麼 ///系統也會提供一個預設的構造器,所以說類至少有一個構造器; ///當然,如果系統提供的預設建構函式,則屬性初值為聲明時賦的初值,如果聲明 ///未賦初值,則是“類型預設值”,比如0或者null。 /// </summary> public YSchool() { this.id = 0; this.name = @"清華附中"; } /// <summary> /// 帶有參數列表的建構函式, /// 屬性的值就是傳入的列表的值。 /// </summary> /// <param name="id"></param> /// <param name="name"></param> public YSchool(int id, string name) { this.id = id; this.name = name; } public YSchool(int id) { this.id = id; this.name = @"陝科大附中"; } }
class Program { static void Main(string[] args) { YSchool shool1 = new YSchool(); YSchool school2 = new YSchool(1, @"西工大附中"); YSchool school3 = new YSchool(2); Console.ReadKey(); } }
上面還修改了id和name的get/set屬性,都改為只有get,因為這些屬性值都是固有屬性,執行個體化之後再賦值也就不符合邏輯了。也就是這些屬性是唯讀。
代碼中提到了預設值,這裡簡單說一下。在聲明欄位的時候,可以用賦值運算子“=”給欄位直接加一個值,比如
string name = string.Empty;
這個不是給變數賦值,預設值只是一種形式,真正給變數賦值還是在建構函式中。一般規範的代碼都要求聲明變數時要賦初值的。如果生命時沒有賦值的欄位,都會由編譯器增加一句賦值代碼,將該欄位賦值為設定的預設值。其實,無論我們是否給欄位增加了預設值,欄位都具備預設值的,只不過如果我們沒有人為增加預設值,欄位的預設值將是0或null。
這裡還有一點要注意,前面提到過系統預設的建構函式,但是當定義了建構函式後,系統預設建構函式就不存在了。因此如果某些情況下,既要用到預設建構函式和帶參數的建構函式,就要手動定義預設建構函式了。比如,
public YSchool() { }
或者
public YSchool() { this.id = 0; this.name = @"尚進"; }
綜上所述執行個體化類的規範運算式應該是:類名 執行個體名 = new 類名(建構函式參數列表);
以上就是C#基礎知識整理:基礎知識(3) 類的構造的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!