C# 各种克隆功能

本文介绍了C#中对象克隆的四种方式:浅拷贝、深拷贝、使用ICloneable接口、类型安全的克隆、手工克隆、利用MemberWiseClone方法以及反射和序列化进行克隆。每种方法的优缺点和适用场景进行了详细讲解,以帮助开发者理解如何在C#中正确实现对象的复制。
摘要由CSDN通过智能技术生成

浅拷贝和深拷贝

有两种对象克隆的方法:浅拷贝和深拷贝。浅拷贝只是复制引用,而不会复制引用的对象。深拷贝会复制引用的对象。

因此,原始对象中的引用和浅拷贝对象中的同一个引用都指向同一个对象。而深拷贝的对象包含了对象的一切直接或间接的引用。参看维基百科(http://en.wikipedia.org/wiki/Object_copy)来获得更多解释。

objectClone
ICloneable接口
ICloneable接口包含一个Clone方法,可以用来创建当前对象的拷贝。

public interface ICloneable 
{ 
    object Clone(); 
}

ICloneable的问题是Clone方法并不会显式地指定是执行浅拷贝或深拷贝,因此调用者将无法确定实际情况。因此,有一些关于把ICloneable从.NET框架中淘汰的讨论。MSDN文档似乎暗示Clone方法是进行的深拷贝,但是文档没有明确的说明:

ICloneable接口包含一个成员方法,Clone,意在支持超过MemberWiseClone所提供的功能… MemberWiseClone进行的是浅拷贝…

类型安全的克隆

ICloneable的另一个缺点是Clone方法返回的是一个对象,因此每次调用Clone都要进行一次强制类型转换。

Person joe = new Person(); 
joe.Name = "Joe Smith"; 
Person joeClone = (Person)joe.Clone();

一种可以避免进行强制类型转换的方式是提供你自己的类型安全的Clone方法。注意,你依然要提供ICloneable.Clone方法的以满足iCloneable接口的要求。

public class Person : ICloneable 
{ 
    public string Name; 
    object ICloneable.Clone() 
    { 
        return this.Clone(); 
    } 
    public Person Clone() 
    { 
        return (Person)this.MemberwiseClone(); 
    } 
}
  1. 手工克隆

一个能够保证对象完全按照你所想的那样进行克隆的方式是手工克隆对象的每一个域(field)。这种方式的缺点是麻烦而且容易出错:如果你在类中增 加了一个域,你很可能会忘记更新Clone方法。还要在克隆引用对象指向原始对象的时候,注意避免无限循环引用。下面是一个进行深拷贝的简单例子:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值