C# 克隆的用法

2019-10-15  本文已影响0人  86a262e62b0b

文章:https://blog.csdn.net/crazyliyang/article/details/17007755

文档:https://docs.microsoft.com/zh-cn/dotnet/api/system.object.memberwiseclone?view=netframework-4.8#%E9%80%82%E7%94%A8%E4%BA%8E

一.MemberwiseClone

  1. 原理:
    MemberwiseClone方法创建一个浅表副本,方法是创建一个新的对象,然后将当前对象的非静态字段复制到新的对象。 如果字段是值类型,则执行字段的逐位副本。 如果字段是引用类型,则会复制引用,但不会复制引用的对象;因此,原始对象及其复本引用相同的对象。

  2. 代码:

using System;

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) this.MemberwiseClone();
    }

    public Person DeepCopy()
    {
       Person other = (Person) this.MemberwiseClone();
       other.IdInfo = new IdInfo(IdInfo.IdNumber);
       other.Name = String.Copy(Name);
       return other;
    }
}

public class Example
{
    public static void Main()
    {
        // Create an instance of Person and assign values to its fields.
        Person p1 = new Person();
        p1.Age = 42;
        p1.Name = "Sam";
        p1.IdInfo = new IdInfo(6565);

        // Perform a shallow copy of p1 and assign it to p2.
        Person p2 = p1.ShallowCopy();

        // Display values of p1, p2
        Console.WriteLine("Original values of p1 and p2:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);
        // The example displays the following output:
        //       Original values of p1 and p2:
        //          p1 instance values:
        //             Name: Sam, Age: 42
        //             Value: 6565
        //          p2 instance values:
        //             Name: Sam, Age: 42
        //             Value: 6565   
        
        // Change the value of p1 properties and display the values of p1 and p2.
        p1.Age = 32;
        p1.Name = "Frank";
        p1.IdInfo.IdNumber = 7878;
        Console.WriteLine("\nValues of p1 and p2 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p2 instance values:");
        DisplayValues(p2);
        //       Values of p1 and p2 after changes to p1:
        //          p1 instance values:
        //             Name: Frank, Age: 32
        //             Value: 7878
        //          p2 instance values:
        //             Name: Sam, Age: 42
        //             Value: 7878
        //       


        // Make a deep copy of p1 and assign it to p3.
        Person p3 = p1.DeepCopy();
        // Change the members of the p1 class to new values to show the deep copy.
        p1.Name = "George";
        p1.Age = 39;
        p1.IdInfo.IdNumber = 8641;
        Console.WriteLine("\nValues of p1 and p3 after changes to p1:");
        Console.WriteLine("   p1 instance values: ");
        DisplayValues(p1);
        Console.WriteLine("   p3 instance values:");
        DisplayValues(p3);

        //       Values of p1 and p3 after changes to p1:
        //          p1 instance values:
        //             Name: George, Age: 39
        //             Value: 8641
        //          p3 instance values:
        //             Name: Frank, Age: 32
        //             Value: 7878
    }

    public static void DisplayValues(Person p)
    {
        Console.WriteLine("      Name: {0:s}, Age: {1:d}", p.Name, p.Age);
        Console.WriteLine("      Value: {0:d}", p.IdInfo.IdNumber);
    }
}
  1. 扩展

如果MemberwiseClone方法执行的浅层复制操作不能满足您的需要,可以通过多种方式实现深层复制操作。 其中包括:

上一篇 下一篇

猜你喜欢

热点阅读