روش انجام کپی عمیق از یک شی در .NET

mohsen1 ماه قبل
ارسال شده در
csharp

استفاده از 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;
    }

}

    
رای
0
ارسال نظر
مرتب سازی:
اولین نفری باشید که نظر می دهید!