📜  C#中的浅复制和深复制(1)

📅  最后修改于: 2023-12-03 15:00:17.246000             🧑  作者: Mango

C#中的浅复制和深复制

在C#中,对象的复制是一个非常重要的概念。复制一个对象可以让我们在不改变原始对象的情况下修改它的副本。C#中提供了两种类型的复制操作:浅复制和深复制。这两种复制操作都有其独特的方式来复制对象,因此我们需要了解其中的区别,以便选择正确的复制方式。

浅复制

浅复制是复制对象的所有成员变量,但是它们的值仍然使用原始对象中的引用。这意味着新对象和原始对象共享相同的对象引用集合。因此,如果在新对象中修改了任何对象,那么这些更改将反映在原始对象中。这是因为两个对象引用相同的对象。这里有一个示例:

class Example
{
    public int x;
    public int[] y;
}

class Program
{
    static void Main(string[] args)
    {
        // Create example object
        Example original = new Example();
        original.x = 1;
        original.y = new int[] { 2, 3, 4 };

        // Shallow copy of example object
        Example copy = (Example)original.MemberwiseClone();

        // Modify deep copy
        copy.x = 5;
        copy.y[0] = 6;

        // Print original object
        Console.WriteLine($"Original values: x = {original.x}, y = [{string.Join(",", original.y)}]");
    }
}

输出结果为:Original values: x = 1, y = [6,3,4]。可以看到,因为浅复制,修改了拷贝对象的y值,原始对象的y值也被修改了。

在示例代码中,我们使用了MemberwiseClone()方法来完成浅复制。请注意,在进行浅复制时,值类型的变量会被复制,但引用类型的变量会被复制引用,而不是实际的对象。因此,必须小心地考虑何时使用浅复制。

深复制

深复制复制对象的所有成员变量,包括引用类型的变量。这意味着新对象和原始对象具有完全独立的对象引用集合。因此,如果在新对象中修改对象,这些更改将不会反映在原始对象中。这里有一个示例:

class Example
{
    public int x;
    public int[] y;
}

class Program
{
    static void Main(string[] args)
    {
        // Create example object
        Example original = new Example();
        original.x = 1;
        original.y = new int[] { 2, 3, 4 };

        // Deep copy of example object
        Example copy = new Example();
        copy.x = original.x;
        copy.y = new int[original.y.Length];
        Array.Copy(original.y, copy.y, original.y.Length);

        // Modify deep copy
        copy.x = 5;
        copy.y[0] = 6;

        // Print original object
        Console.WriteLine($"Original values: x = {original.x}, y = [{string.Join(",", original.y)}]");
    }
}

输出结果为:Original values: x = 1, y = [2,3,4]。可以看到,因为使用了深复制,修改了拷贝对象的y值,并没有影响原始对象的y值。

在示例代码中,我们手动复制了每个成员变量,并使用Array.Copy()方法来复制数组。在进行深复制时,必须确保复制每个成员变量中的所有内容。

结论

C#中的浅复制和深复制提供了不同的方式来复制对象。浅复制复制对象的所有成员变量,但使用和原始对象相同的对象引用集合。因此,如果在新对象中修改任何对象,那么这些更改将反映在原始对象中。深复制会复制对象的所有成员变量,包括引用类型的变量。这意味着两个对象具有完全独立的对象引用集合,因此在一个对象中的更改不会反映在另一个对象中。要选择正确的复制方式,请仔细考虑对象的成员变量类型和复制的需求。