浅复制和深复制

浅复制:

被复制对象的所有变量都含有与原来的对象相同的值,而其所有的对其他对象的引用都仍然指向原来的对象。

补充:

一个对象中的字段有的是值类型的,有的是引用类型的。对于值类型字段来说,它的值就是简单的值,而对于引用类型来说,它的值是地址。

浅复制在复制时,将这个对象的值字段和引用字段(均为非静态字段)全部复制过去,获得了这个对象的值和地址。

即:当其中一个对象的引用字段所指向的地址中的变量变化时,所有浅复制对象中的该引用字段都会发生变化。

例子:

基础类:

public class Person

{

    public string Name { get; set; }



    public int Age { get; set; }

}



public class BaseClass

{

    //值类型

    public int Grade

    {

        get;

        set;

    }



    /// <summary>

    /// 引用类型

    /// </summary>

    public Person P

    {

        get;

        set;

    }



    public BaseClass Clone()

    {

        return (BaseClass)this.MemberwiseClone();

    }

}

页面:

public partial class calculate_Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        BaseClass bc1 = new BaseClass() { Grade = 1, P = new Person() { Age = 20, Name = "www" } };



        BaseClass bc2 = bc1;



        BaseClass bc3 = bc1.Clone();



        //True

        Response.Write((bc1 == bc2).ToString() + "<br/>");



        //False

        Response.Write((bc1 == bc3).ToString() + "<br/>");



        //False

        Response.Write((bc2 == bc3).ToString() + "<br/>");





        bc1.P.Name = "Changed";



        //Changed

        Response.Write(bc1.P.Name + "<br/>");



        //Changed

        Response.Write(bc2.P.Name + "<br/>");



        //Changed

        Response.Write(bc3.P.Name + "<br/>");

    }

}

深复制:

被复制对象会将所有非引用类型的字段复制给新对象,同时将引用类型所指向地址中存的对象复制给新的对象。

基础类:

public class Person

{

    public string Name { get; set; }



    public int Age { get; set; }



    public Person Clone()

    {

        return (Person)this.MemberwiseClone();

    }

}



public class BaseClass

{

    //值类型

    public int Grade

    {

        get;

        set;

    }



    /// <summary>

    /// 引用类型

    /// </summary>

    public Person P

    {

        get;

        set;

    }



    /// <summary>

    /// 增加此空构造函数是为了使对象初始化器使用

    /// </summary>

    public BaseClass()

    {



    }



    /// <summary>

    /// 此为内部复制引用类型字段使用,

    /// 注意:Person类增加了一个方法

    /// </summary>

    /// <param name="p"></param>

    BaseClass(Person p)

    {

        this.P = p.Clone();

    }



    public BaseClass Clone()

    {

        BaseClass bc = new BaseClass(this.P);

        bc.Grade = this.Grade;

        return bc;

    }

}

页面代码:

public partial class calculate_Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        BaseClass bc1 = new BaseClass() { Grade = 1, P = new Person() { Age = 20, Name = "www" } };



        BaseClass bc2 = bc1;



        BaseClass bc3 = bc1.Clone();



        //True

        Response.Write((bc1 == bc2).ToString() + "<br/>");



        //False

        Response.Write((bc1 == bc3).ToString() + "<br/>");



        //False

        Response.Write((bc2 == bc3).ToString() + "<br/>");





        bc1.P.Name = "Changed";



        //Changed

        Response.Write(bc1.P.Name + "<br/>");



        //Changed

        Response.Write(bc2.P.Name + "<br/>");



        //www

        Response.Write(bc3.P.Name + "<br/>");

    }

}

区别:

浅复制和深复制的区别仅在于对引用类型的对待上,一个是复制的地址,一个是复制的地址指向位置的数据.

你可能感兴趣的:(复制)