• C#中实现对象的深拷贝


    深度拷贝指的是将一个引用类型(包含该类型里的引用类型)拷贝一份(在内存中完完全全是两个对象,没有任何引用关系)..........  直接上代码:

     1     /// <summary>
     2     /// 对象的深度拷贝(序列化的方式)
     3     /// </summary>
     4     public static class MyDeepCopy
     5     {
     6 
     7         /// <summary>
     8         /// xml序列化的方式实现深拷贝
     9         /// </summary>
    10         /// <typeparam name="T"></typeparam>
    11         /// <param name="t"></param>
    12         /// <returns></returns>
    13         public static T XmlDeepCopy<T>(T t)
    14         {
    15             //创建Xml序列化对象
    16             XmlSerializer xml = new XmlSerializer(typeof(T));
    17             using (MemoryStream ms = new MemoryStream())//创建内存流
    18             {
    19                 //将对象序列化到内存中
    20                 xml.Serialize(ms, t);
    21                 ms.Position = default;//将内存流的位置设为0
    22                 return (T)xml.Deserialize(ms);//继续反序列化
    23             }
    24         }
    25 
    26         /// <summary>
    27         /// 二进制序列化的方式进行深拷贝
    28         /// 确保需要拷贝的类里的所有成员已经标记为 [Serializable] 如果没有加该特性特报错
    29         /// </summary>
    30         /// <typeparam name="T"></typeparam>
    31         /// <param name="t"></param>
    32         /// <returns></returns>
    33         public static T BinaryDeepCopy<T>(T t)
    34         {
    35             //创建二进制序列化对象
    36             BinaryFormatter bf = new BinaryFormatter();
    37             using (MemoryStream ms = new MemoryStream())//创建内存流
    38             {
    39                 //将对象序列化到内存中
    40                 bf.Serialize(ms, t);
    41                 ms.Position = default;//将内存流的位置设为0
    42                 return (T)bf.Deserialize(ms);//继续反序列化
    43             }
    44         }
    45     }
    View Code

    浅拷贝指的是将该类型里面的值类型拷贝,而该类型里的引用类型不进行拷贝,实现浅拷贝很简单,再该类里编写一个方法,方法内部调用自身的MemberwiseClone()方法即可得到一个object类型的对象,将它强转成当前对象返回即可,列如:

     1     public class Person
     2     {
     3         public int ID { get; set; }
     4         public string Name { get; set; }
     5         public string Email { get; set; }
     6         public Cat Cat { get; set; }
     7 
     8         /// <summary>
     9         /// Person类的浅拷贝
    10         /// </summary>
    11         /// <returns></returns>
    12         public Person QainClone()
    13         {
    14             //调用自带的浅拷贝方法得到的是一个objec类型的对象,然后强转直接返回就可以了
    15             return MemberwiseClone() as Person;
    16         }
    17     }
    View Code

    string是个列外

  • 相关阅读:
    flask 基础
    新的项目部署
    linux (01) linux基础
    linux (04) linux安装mysql
    linux (06) redis安装
    linux (09) nginx反向代理,负载均衡
    linux (08) nginx入门详解
    linux (07) redis详解
    linux(05) 编译安装py3
    spring-boot war包部署(二)
  • 原文地址:https://www.cnblogs.com/heheblog/p/net_study_20180716.html
Copyright © 2020-2023  润新知