2017年9月23日 星期六

C# : 撰寫複製建構函式 Constructor ctor

由於類別型別是參考型別,因此,所實例化出來的執行個體,為堆積記憶體內,而當時持有的物件變數,實際上是儲存這個物件的參考位址,若我們想要把 obj1 的所有狀態,複製到 obj2 物件,如這樣的敘述 obj1 = obj2;,在 C# 內,並不會做到剛剛需求,而是 obj1 & obj2 同時指向堆積內的同一個物件中。
因此,這個練習中,我們將要來學習如何複製一個物件成為另外一個新物件,並且在新物件中所有的資料成員,將會與原先物件的資料成員內容一樣。
我們宣告一個類別型別 Person,在這個類別中,宣告了兩個資料狀態,在這裡,我們使用兩個屬性。
在這裡,我們宣告了兩個建構函式,其中
  • public Person(string name, int age)
    則是用來建立一個新的 Person 物件,並且根據所傳入的參數值,進行該物件的狀態屬性初始化
  • public Person(Person previousPerson)
    這個建構函式,將是我們設計用來複製出一個全新的物件,並且根據所傳入的參數物件,將傳入參數物件的所有資料狀態,複製到這個新物件上。
    class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }

        // 宣告一個複製物件的建構式
        public Person(Person previousPerson)
        {
            Name = previousPerson.Name;
            Age = previousPerson.Age;
        }

        //// 這裡宣告的複製物件建構函式,
        //// 將會呼叫另外一個建構函式,進行物件的初始化
        //public Person(Person previousPerson)
        //    : this(previousPerson.Name, previousPerson.Age)
        //{
        //}

        // 宣告一個建構函式,並且進行物件成員值的初始化
        public Person(string name, int age)
        {
            Name = name;
            Age = age;
        }

        // 覆蓋 object.ToString 方法,顯示該物件的詳細資料
        public override string ToString()
        {
            return Name + " is " + Age.ToString();
        }
    }

進行測試

在底下的程式碼中,我們首先建立一個物件,person1,並且設定這個物件的 Name / Age 這兩個屬性值。
接著,我們使用複製物件的建構函式,把 person1 的物件,傳入到這個複製物件建構函式引數內,如此,我們就得到一個內容完全相同的物件,並且 person1 與 person2 分別指向到不同的堆積記憶體空間內。
然後,為了要確認 person1 與 person2 分別指向不同的記憶體空間,我們使用將 person1 / person2 的屬性值進行修改,並且將這兩個物件的屬性值顯示出來,就可以確認這兩個物件是在不同的堆積記憶體空間中。
            // 建立一個 Person 物件,且於建構函式引數內,指定要初始化的成員值
            Person person1 = new Person("George", 40);

            // 使用複製建構函式,產生一個成員值完全相同的 Person 物件
            Person person2 = new Person(person1);

            Console.WriteLine("person1 / person2 兩個物件成員值");
            Console.WriteLine($"person1 : {person1.ToString()}");
            Console.WriteLine($"person2 : {person2.ToString()}");
            Console.WriteLine("Press any key for continuing...");
            Console.ReadKey();

            Console.WriteLine("進行修改 person1 / person2 兩個物件成員值");
            person1.Age = 39;
            person2.Age = 41;
            person2.Name = "Charles";

            Console.WriteLine("person1 / person2 兩個物件成員值");
            Console.WriteLine($"person1 : {person1.ToString()}");
            Console.WriteLine($"person2 : {person2.ToString()}");
            Console.WriteLine("Press any key for continuing...");
            Console.ReadKey();

沒有留言:

張貼留言