技术开发 频道

C# Tips:浅拷贝和深拷贝

  浅拷贝后的对象的值类型字段更改不会反映到源对象,而赋值运算后的对象的值类型字段更改会反映到源对象

  代码实现如下:

    public class Person
    {
        
public int Age { get; set; }
        
public string Address { get; set; }
        
public Name Name { get; set; }
    }
    
public class Name
    {
        
public Name(string frisName,string lastName)
        {
            FristName
= frisName;
            LastName
= lastName;
        }
        
public string FristName { get; set; }
        
public string LastName { get; set; }
    }

  深拷贝实现
      
  相对于浅拷贝,是指依照源对象为原型,创建一个新对象,将当前对象的所有字段进行执行逐位复制并支持递归,不管是是值类型还是引用类型,不管是静态字段还是非静态字段。
     
  在C#中,我们们有三种方法实现深拷贝

  实现ICloneable接口,自定义拷贝功能。

  ICloneable 接口,支持克隆,即用与现有实例相同的值创建类的新实例。

  ICloneable 接口包含一个成员 Clone,它用于支持除所提供的克隆之外的克隆。Clone 既可作为深层副本实现,也可作为浅表副本实现。在深层副本中,所有的对象都是重复的;而在浅表副本中,只有优异对象是重复的,并且优异以下的对象包含引用。结果克隆必须与原始实例具有相同的类型或是原始实例的兼容类型。

  代码实现如下:

public class Person:ICloneable
    {
        
public int Age { get; set; }
        
public string Address { get; set; }
        
public Name Name { get; set; }

        
public object Clone()
        {
            Person tem
= new Person();
            tem.Address
= this.Address;
            tem.Age
= this.Age;

            tem.Name
= new Name(this.Name.FristName, this.Name.LastName);

            
return tem;
        }
    }


    
public class Name
    {
        
public Name(string frisName, string lastName)
        {
            FristName
= frisName;
            LastName
= lastName;
        }
        
public string FristName { get; set; }
        
public string LastName { get; set; }
    }

  大家可以看到,Person类继承了接口ICloneable并手动实现了其Clone方法,这是个简单的类,试想一下,如果你的类有成千上万个引用类型成员(当然太夸张,几十个还是有的),这是不是份很恐怖的劳力活?

0
相关文章