C# 中的深拷貝

Muhammad Maisam Abbas 2021年4月29日
C# 中的深拷貝

本教程將介紹在 C# 中建立類物件的深拷貝的方法。

在 C# 中使用 BinaryFormatter 類進行深拷貝物件

深拷貝意味著將一個物件的每個欄位複製到另一個物件,而淺層複製意味著建立一個新的類例項並將其指向先前的類例項的值。我們可以使用 BinaryFormatter 在 C# 中建立類物件的深拷貝。BinaryFormatter 類以二進位制格式讀取和寫入類物件到流中。我們可以使用 BinaryFormatter.Serialize() 方法將類物件寫入 C# 中的記憶體流。然後,我們可以使用 BinaryFormatter.Deserialize() 方法將相同的記憶體流寫入物件並返回它。我們需要首先將我們的類標記為 [Serializable],以便這種方法能夠發揮作用。下面的程式碼例子向我們展示瞭如何用 C# 中的 BinaryFormatter 類建立一個物件的深度拷貝。

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace deep_copy
{
    [Serializable]
    public class Sample
    {
        public string sampleName { get; set; }
        
    }
    static class ext
    {
        public static Sample deepCopy<Sample>(this Sample obj)
        {
            using (var memStream = new MemoryStream())
            {
                var bFormatter = new BinaryFormatter();
                bFormatter.Serialize(memStream, obj);
                memStream.Position = 0;

                return (Sample)bFormatter.Deserialize(memStream);
            }
        }

    }
    class Program
    {
        static void Main(string[] args)
        {
            Sample s1 = new Sample();
            s1.sampleName = "Sample number 1";
            Sample s2 = s1.deepCopy();
            Console.WriteLine("Sample 1 = {0}", s1.sampleName);
            Console.WriteLine("Sample 2 = {0}", s2.sampleName);
        }
    }
}

輸出:

Sample 1 = Sample number 1
Sample 2 = Sample number 1

在上面的程式碼中,我們建立了 Sample 類的物件 s1 的深拷貝,並使用 C# 中的 BinarySerializer 類將其儲存在同一類的物件 s2 中。

Muhammad Maisam Abbas avatar Muhammad Maisam Abbas avatar

Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.

LinkedIn

相關文章 - Csharp Class