我們定義了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) 類別的建構的內容,更多相關內容請關注PHP中文網(www.php.cn)!