روش انجام کپی عمیق از یک شی در .NET
استفاده از BinaryFormatter
یکی از روشهای محبوب برای کپی عمیق استفاده از BinaryFormatter
است. به طور خاص، میتوانید یک متد عمومی به شکل زیر ایجاد کنید:
public static T DeepClone<T>(this T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
برای درست کار کردن این روش، باید از اتریبیوت [Serializable]
برای کلاس خود استفاده کنید. با این حال، باید توجه داشته باشید که BinaryFormatter
از نوامبر 2023 منسوخ شده است و بهتر است از آن استفاده نکنید.
استفاده از متد MemberwiseClone
روش جایگزین و کارآمدتر استفاده از روشهای مبتنی بر MemberwiseClone
است. این متد یک کپی کم عمق از شی درست می کند. فیلدهای غیر استاتیک را به شی جدید منتقل می کند. اگر فیلد از نوع مقدار بود، بیت به بیت مقدار کپی می شود. اگر نوع رفرنس بود، فقط رفرنس کپی می شود. یعنی بعد از کپی هر دو شی به یک شی اشاره می کنند. به همین دلیل می بایست بعد از فراخوانی این متد، برای پراپرتی های نوع رفرنس، مجدد عمل کپی را انجام دهید یا یک کپی عمیق داشته باشید.
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)MemberwiseClone();
}
public Person DeepCopy()
{
Person other = (Person)MemberwiseClone();
other.IdInfo = new IdInfo(IdInfo.IdNumber);
return other;
}
}