美文网首页
C# 克隆的用法

C# 克隆的用法

作者: 86a262e62b0b | 来源:发表于2019-10-15 17:04 被阅读0次

文章: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方法执行的浅层复制操作不能满足您的需要,可以通过多种方式实现深层复制操作。 其中包括:

  • MemberwiseClone调用方法以创建对象的浅表副本,然后将新对象的值与原始对象的值相同,分配给任何属性或其值为引用类型的字段。 该DeepCopy示例中的方法演示了这种方法。

  • 序列化要深层复制的对象,然后将序列化的数据还原到其他对象变量。

  • 使用带有递归的反射来执行深层复制操作。

相关文章

网友评论

      本文标题:C# 克隆的用法

      本文链接:https://www.haomeiwen.com/subject/ldyryctx.html