C# 深拷贝与浅拷贝

实体类如下


  class CWebPage
  {
      public Uri Uri; // E.g. http://www.google.com
      public int Count; // E.g. 10
  }
  
  var list = new List<CWebPage>();
  
  1. 通过构造函数实现浅拷贝
 var copy = new List<CWebPage>(list);

如果要对列表进行排序,那么浅拷贝很有用。在这种情况下,我们尤其不想要深层拷贝。我们不想复制列表项,只复制列表对象和指向它们的引用变量。


  copy.Sort(delegate (CWebPage left, CWebPage right)
  {
      return left.Uri.Host.CompareTo(right.Uri.Host);
  });
  
  1. 深拷贝:类要继承ICloneable并实现接口,本例使用foreach

  class CWebPage : ICloneable
  {
      public Uri Uri;
      public int Count;
  
      // This is a deep copy implementation of Clone
      public object Clone()
      {
          return new CWebPage
          {
              Uri = new Uri(this.Uri.OriginalString),
              Count = this.Count,
          };
      }
  }
  
  var copy = new List<CWebPage>();
  
  foreach(var elt in list)
  {
      copy.Add((CWebPage)elt.Clone());
  }
  
  1. 使用list.foreach 实现深拷贝
 var copy = new List<CWebPage>();
  
  list.ForEach(delegate (CWebPage page)
  {
      copy.Add((CWebPage)page.Clone());
  });
  1. 使用 ConvertAll 和 ICloneable
  var copy = list.ConvertAll(elt => elt.Clone());
  1. 使用Select 和 ICloneable
  var copy = list.Select(elt => elt.Clone()).ToList();
  1. 序列化反序列化
  string serialized = JsonConvert.SerializeObject(list);
  var copy = JsonConvert.DeserializeObject<List<CWebPage>>(serialized);
  1. 其他方式

 var copy = Clone<CWebPage>(list);
 public static List<T> Clone<T>(object List)
        {
            using (Stream objectStream = new MemoryStream())
            {
                IFormatter formatter = new BinaryFormatter();
                formatter.Serialize(objectStream, List);
                objectStream.Seek(0, SeekOrigin.Begin);
                return formatter.Deserialize(objectStream) as List<T>;
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值