C# 深拷贝深复制

我们自己写代码的时候经常会直接赋值,然而对于C#而言,除了基本的数据类型,我们所构建的其他类都会要用到深拷贝才能拷贝到一个新的对象当中,若是直接引用,无异于指向同一个对象。

[Serializable] //用于深复制的类加上这个
 public class ShippingModel : IComparable
  {
  .... //这些是每个属性
    //深拷貝賦值
    public ShippingModel DeepClone()
    {
        using (Stream objectStream = new MemoryStream())
        {
            IFormatter formatter = new BinaryFormatter();
            formatter.Serialize(objectStream, this);
            objectStream.Seek(0, SeekOrigin.Begin);
            return formatter.Deserialize(objectStream) as ShippingModel;//返回深拷贝的类
        }
    }
  }

引用的时候调用即可

ShippingModel model = new ShippingModel();
model = Shipping.DeepClone();//深拷贝一个对象

第二种方法,直接创建复制类

public class Clone
 {
     /// <summary>
     /// 深克隆
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="t"></param>
     /// <returns></returns>
     public static T DepthClone<T>(T t)
     {
         T clone = default(T);
         using (Stream stream = new MemoryStream())
         {
             IFormatter formatter = new BinaryFormatter();
             try
             {
                 formatter.Serialize(stream, t);
                 stream.Seek(0, SeekOrigin.Begin);
                 clone = (T)formatter.Deserialize(stream);
             }
             catch (SerializationException e)
             {
                 Console.WriteLine("Failed to serialize. Reason: " + e.Message);
                 throw;
             }
         }
         return clone;
     }
 }

使用的时候

 Student stu1 = new Student();//实例化一个对象
 stu1.obj = new object();//实例化对象中的引用对象
 Student stu2 = Clone.DepthClone(stu1);//深克隆对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值