因此,這個練習中,我們將要來學習如何複製一個物件成為另外一個新物件,並且在新物件中所有的資料成員,將會與原先物件的資料成員內容一樣。
我們宣告一個類別型別
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();
obj1 = obj2;
,在 C# 內,並不會做到剛剛需求,而是 obj1 & obj2 同時指向堆積內的同一個物件中。