MemberwiseClone() 是 C# 中的一個方法,用于創建當前對象的淺拷貝(shallow copy)。它屬于 System.Object 類,因此所有 C# 對象都可以調用該方法。
1. MemberwiseClone() 的含義
淺拷貝:MemberwiseClone() 會創建一個新對象,并將當前對象的所有字段復制到新對象中。對于值類型字段,直接復制值;對于引用類型字段,復制的是引用(即新對象和原對象共享相同的引用類型實例)。
返回類型:返回一個 object 類型,因此通常需要將其強制轉換為目標類型。
2. 示例代碼
public class Person
{public string Name;public int Age;public Address Address;public Person ShallowCopy(){return (Person)this.MemberwiseClone();}
}public class Address
{public string City;public string Street;
}class Program
{static void Main(){Person person1 = new Person{Name = "John",Age = 30,Address = new Address { City = "New York", Street = "5th Avenue" }};Person person2 = person1.ShallowCopy();Console.WriteLine(person1.Address.City); // 輸出: New YorkConsole.WriteLine(person2.Address.City); // 輸出: New Yorkperson2.Address.City = "Los Angeles";Console.WriteLine(person1.Address.City); // 輸出: Los AngelesConsole.WriteLine(person2.Address.City); // 輸出: Los Angeles}
}
在上面的例子中,person2 是 person1 的淺拷貝。修改 person2 的 Address 屬性會同時影響 person1,因為它們共享同一個 Address 對象。
3. 其他相關函數
深拷貝(Deep Copy):與淺拷貝不同,深拷貝會遞歸復制所有引用類型字段,創建一個完全獨立的對象。C# 沒有內置的深拷貝方法,通常需要手動實現或使用序列化等方式。
示例實現深拷貝:
public class Person
{public string Name;public int Age;public Address Address;public Person DeepCopy(){Person other = (Person)this.MemberwiseClone();other.Address = new Address { City = this.Address.City, Street = this.Address.Street };return other;}
}
ICloneable 接口:這是一個標準接口,定義了 Clone() 方法,用于支持對象的克隆。可以實現該接口來提供自定義的克隆邏輯。
示例:
public class Person : ICloneable
{public string Name;public int Age;public Address Address;public object Clone(){return this.MemberwiseClone(); // 淺拷貝}
}
序列化實現深拷貝:通過序列化和反序列化實現深拷貝。
示例:
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;public static class ObjectCopier
{public static T DeepCopy<T>(T obj){using (var ms = new MemoryStream()){var formatter = new BinaryFormatter();formatter.Serialize(ms, obj);ms.Position = 0;return (T)formatter.Deserialize(ms);}}
}
4. 應用場景
淺拷貝:適用于對象結構簡單,且引用類型字段不需要獨立拷貝的場景。
深拷貝:適用于對象結構復雜,且需要完全獨立拷貝的場景,例如在需要修改拷貝對象而不影響原對象時。
總結
MemberwiseClone() 是 C# 中用于淺拷貝的方法。
深拷貝需要手動實現或通過序列化等方式實現。
ICloneable 接口提供了一種標準化的克隆方式。