c# 深拷贝 浅拷贝


c# 深拷贝 浅拷贝 简介

深拷贝、浅拷贝在c#中都是对对象进行拷贝(复制、克隆),应用当前对象复制一个一模一样的对象。



深拷贝与浅拷贝的区别 :
对引用类型的处理不同
深拷贝对引用类型的处理方式,在新对象中创建一个新的对象和原始对象中对应 字段内容相同的字段。
浅拷贝 对非字符串的引用类型,只拷贝引用地址,所以 源对象中的引用类型的值变化会影响copy对象中的值。


深复制 操作方法:当前类需要实现ICloneable接口中的Clone方法,对可进行深拷贝的对象上需加上[Servializable]特性
浅复制 操作方法:使用Object类中的MemberwiseClone方法创建一个浅拷贝副本


c# 深拷贝 浅拷贝 举例测试

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace bossManage
{


    #region 引用类型定义

    class testInfo
    {
        public string nameTest2=@"这是引用类型默认值";
    }


    #endregion




    #region 类定义

    class baseInfo : System.Object, ICloneable
    {

        public string nameTest = @"这是值类型原始数值"; //值类型
        public testInfo nameTest2 = new testInfo();  //引用类型--当采用浅拷贝方式时,源对象或拷贝对象中的值发生变化时候,两个对象中的值都会发生变化
        public object Clone()
        {
            return new baseInfo() as object; //深拷贝
        }


        public object shallowCopy()
        {
            return this.MemberwiseClone();
        }

        public object thisCopy()
        {
            return this as object;
        }


    }

    #endregion


    public partial class test2 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            #region 测试深拷贝 浅拷贝

            baseInfo main = new baseInfo();
            Response.Write("main对象:"+main.nameTest+"
"); Response.Write("深拷贝

"); //深拷贝 baseInfo deepMain = main.Clone() as baseInfo; Response.Write("main对象" + main.nameTest + " deepMain对象:" + deepMain.nameTest + "
"); Response.Write("main对象" + main.nameTest2.nameTest2 + " deepMain对象:" + deepMain.nameTest2.nameTest2 + "
"); deepMain.nameTest = @"深拷贝值类型数值改变!"; deepMain.nameTest2.nameTest2 = "引用类型深拷贝值改变"; Response.Write("main对象" + main.nameTest + " deepMain对象:" + deepMain.nameTest + "
"); Response.Write("main对象" + main.nameTest2.nameTest2 + " deepMain对象:" + deepMain.nameTest2.nameTest2 + "
"); Response.Write("浅拷贝

"); //浅拷贝 baseInfo shallowMain = main.shallowCopy() as baseInfo; Response.Write("main对象" + main.nameTest + " shallowMain对象:" + shallowMain.nameTest + "
"); Response.Write("main对象" + main.nameTest2.nameTest2 + " shallowMain对象:" + shallowMain.nameTest2.nameTest2 + "
"); shallowMain.nameTest = @"浅拷贝值类型数值改变!"; shallowMain.nameTest2.nameTest2 = "引用类型浅拷贝值改变"; Response.Write("main对象" + main.nameTest + " shallowMain对象:" + shallowMain.nameTest + "
"); Response.Write("main对象" + main.nameTest2.nameTest2 + " shallowMain对象:" + shallowMain.nameTest2.nameTest2 + "
"); Response.Write("同一对象

"); //同一对象 baseInfo thisMain = main.thisCopy() as baseInfo; Response.Write("main对象" + main.nameTest + " thisMain对象:" + thisMain.nameTest + "
"); Response.Write("main对象" + main.nameTest2.nameTest2 + " thisMain对象:" + thisMain.nameTest2.nameTest2 + "
"); thisMain.nameTest = @"this对象数值改变!"; thisMain.nameTest2.nameTest2 = "this对象值改变"; Response.Write("main对象" + main.nameTest + " thisMain对象:" + thisMain.nameTest + "
"); Response.Write("main对象" + main.nameTest2.nameTest2 + " thisMain对象:" + thisMain.nameTest2.nameTest2 + "
"); #endregion } } }

运行结果 如下图所示:
c#深拷贝浅拷贝运行结果