C#基礎知識整理:基礎知識(3) 類別的構造

黄舟
發布: 2017-02-10 15:38:45
原創
1229 人瀏覽過

我們定義了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)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板