場景:MVVM模式中數據雙向綁定,想實現編輯、保存、撤銷操作時也雙向綁定了,不能實現撤銷操作。
后來通過搜索找到了繼承IEditableObject接口實現撤銷操作,但是對其中使用了MemberwiseClone還不是很了解。
MemberwiseClone:
https://msdn.microsoft.com/zh-cn/library/system.object.memberwiseclone(v=vs.110).aspx
MemberwiseClone方法創建的新對象,然后將當前對象的非靜態字段復制到新的對象創建的淺表副本。
如果字段是值類型,則執行字段的按位復制。
如果字段是引用類型,引用將復制,但被引用的對象不會被復制。因此,原始對象和其克隆引用同一對象。
筆記:修改克隆對象會影響原對象的引用類型。
DeepCopy:
In a deep copy, all objects are duplicated; in a shallow copy, only the top-level objects are duplicated and the lower levels contain references.
在深拷貝中,會復制所有對象。在淺拷貝中,僅對頂級對象進行了復制,對低級別對象進行了引用。
筆記:深拷貝中,修改克隆對象不會影響原對象。
附上代碼,其中Persona類實現了淺拷貝和深拷貝的方法。
深拷貝額外復制了其中自定義的類IdInfo。
using System; public class IdInfo { public int IdNumber; public IdInfo(int IdNumber) { this.IdNumber = IdNumber; } } public class Person { public int Age; public string Name; public IdInfo IdInfo; public Person ShallowCopy() { return (Person) this.MemberwiseClone(); } public Person DeepCopy() { Person other = (Person) this.MemberwiseClone(); other.IdInfo = new IdInfo(IdInfo.IdNumber); other.Name = String.Copy(Name); return other; } } public class Example { public static void Main() { // Create an instance of Person and assign values to its fields. Person p1 = new Person(); p1.Age = 42; p1.Name = "Sam"; p1.IdInfo = new IdInfo(6565); // Perform a shallow copy of p1 and assign it to p2. Person p2 = p1.ShallowCopy(); // Display values of p1, p2 Console.WriteLine("Original values of p1 and p2:"); Console.WriteLine(" p1 instance values: "); DisplayValues(p1); Console.WriteLine(" p2 instance values:"); DisplayValues(p2); // Change the value of p1 properties and display the values of p1 and p2. p1.Age = 32; p1.Name = "Frank"; p1.IdInfo.IdNumber = 7878; Console.WriteLine("\nValues of p1 and p2 after changes to p1:"); Console.WriteLine(" p1 instance values: "); DisplayValues(p1); Console.WriteLine(" p2 instance values:"); DisplayValues(p2); // Make a deep copy of p1 and assign it to p3. Person p3 = p1.DeepCopy(); // Change the members of the p1 class to new values to show the deep copy. p1.Name = "George"; p1.Age = 39; p1.IdInfo.IdNumber = 8641; Console.WriteLine("\nValues of p1 and p3 after changes to p1:"); Console.WriteLine(" p1 instance values: "); DisplayValues(p1); Console.WriteLine(" p3 instance values:"); DisplayValues(p3); } public static void DisplayValues(Person p) { Console.WriteLine(" Name: {0:s}, Age: {1:d}", p.Name, p.Age); Console.WriteLine(" Value: {0:d}", p.IdInfo.IdNumber); } }