溫馨提示×

clone c#對象深拷貝怎樣實現(xiàn)

c#
小樊
81
2024-09-28 04:50:00
欄目: 編程語言

在C#中,要實現(xiàn)對象的深拷貝,你可以使用序列化和反序列化的方法。這種方法會創(chuàng)建一個新的對象,并將原始對象的所有屬性值復制到新對象中,包括嵌套的對象。以下是一個簡單的示例:

  1. 首先,確保你的類實現(xiàn)了Serializable接口。這個接口告訴C#編譯器該類的對象可以被序列化。
[Serializable]
public class MyClass
{
    public int Id { get; set; }
    public string Name { get; set; }
    public MyNestedClass NestedObject { get; set; }
}

[Serializable]
public class MyNestedClass
{
    public int NestedId { get; set; }
    public string NestedName { get; set; }
}
  1. 然后,使用BinaryFormatter類將對象序列化為字節(jié)數(shù)組,再將字節(jié)數(shù)組反序列化為新的對象。這樣就可以實現(xiàn)深拷貝了。
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

public class DeepCopyHelper
{
    public static T DeepCopy<T>(T obj) where T : Serializable
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            binaryFormatter.Serialize(memoryStream, obj);

            memoryStream.Position = 0;
            T copiedObj = (T)binaryFormatter.Deserialize(memoryStream);
            return copiedObj;
        }
    }
}
  1. 使用DeepCopyHelper.DeepCopy()方法進行深拷貝。
public class Program
{
    public static void Main()
    {
        MyClass originalObject = new MyClass
        {
            Id = 1,
            Name = "Original",
            NestedObject = new MyNestedClass
            {
                NestedId = 1,
                NestedName = "Nested Original"
            }
        };

        MyClass copiedObject = DeepCopyHelper.DeepCopy(originalObject);

        Console.WriteLine("Original Object:");
        Console.WriteLine($"Id: {originalObject.Id}, Name: {originalObject.Name}, NestedObject.NestedId: {originalObject.NestedObject.NestedId}, NestedObject.NestedName: {originalObject.NestedObject.NestedName}");

        Console.WriteLine("\nCopied Object:");
        Console.WriteLine($"Id: {copiedObject.Id}, Name: {copiedObject.Name}, NestedObject.NestedId: {copiedObject.NestedObject.NestedId}, NestedObject.NestedName: {copiedObject.NestedObject.NestedName}");
    }
}

這個示例中,originalObjectcopiedObject是兩個完全獨立的對象,它們具有相同的屬性值。請注意,BinaryFormatter在.NET Core和.NET 5/6/7等后續(xù)版本中已被棄用,但在.NET Framework中仍然可用。如果你使用的是.NET Core或更高版本,可以考慮使用其他序列化庫,如Json.NET(現(xiàn)在叫Newtonsoft.Json)或System.Text.Json。

0