华域联盟 .Net ASP.NET深度复制和浅度复制分析

ASP.NET深度复制和浅度复制分析

本文深入浅出的分析了ASP.NET深度复制和浅度复制。分享给大家供大家参考。具体分析如下:

之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了,写出来与到家共勉。

如果大家不懂值类型和引用类型的区别,请先看https://www.cnhackhy.com/article/57471.htm,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了。

大家都知道Object是所有类共同的基类,其有个方法是MemberwiseClone(),其用途为

我们可以通过这个方法来达到浅度复制的效果。

下面我们通过一个例子来阐述一下浅度复制,其与深度复制的区别在什么地方:

复制代码 代码如下:
public class Content

{

        public int Val;

}

public class Cloner

{

        public Content MyContent = new Content();

        public Cloner(int newVal)
        {
            MyContent.Val = newVal;
        }
        public object GetCopy()
        {
            return MemberwiseClone();
        }
}

在这里我们有两个类,一个Content类,只有一个为值类型int的Val,还有个类是一个Cloner类,其有一个Content类型的成员,然后有个构造函数可以初始化成员,最后有一个GetCopy的方法,通过MemberwiseClone方法来复制自己。

下面我们通过一段代码来调用Cloner类:

复制代码 代码如下:
static void Main(string[] args)

{

    Cloner source = new Cloner(10);

    Cloner target = (Cloner)source.GetCopy();//返回的是一个Object类型 需要做类型转换.

    Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val);

    source.MyContent.Val = 15;

    Console.WriteLine("target.MyContent.Val = {0}", target.MyContent.Val);

    Console.ReadKey();

}

结果是:

我们可以看到我们通过GetCopy()函数复制类source给target,但是当我们改变source的时候,source输出的值也跟着改变。由此我们可以得出,我们通过MemberwiseClone()复制的只是引用,即source和target的MyContent是相同的对象实例。这就是浅度复制,那我们如何实现深度复制呢,在.NET Framework中,给我们提供了ICloneable接口。

首先我们看下ICloneable接口:

复制代码 代码如下:
// 摘要:

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

[ComVisible(true)]
public interface ICloneable

{

        // 摘要:

        //     创建作为当前实例副本的新对象。

        //

        // 返回结果:

        //     作为此实例副本的新对象。

        object Clone();

}

在上面那个例子中,我们只需要修改一些代码就可以了:

复制代码 代码如下:
public class Cloner:ICloneable

{

        public Content MyContent = new Content();

        public Cloner(int newVal)
        {
            MyContent.Val = newVal;
        }
        //public object GetCopy()
        //{
        //    return MemberwiseClone();
        //}
        public object Clone()
        {
            Cloner cloned = new Cloner(MyContent.Val);
            return cloned;
        }
}

为了做区别我把之前的代码放在上面,注释了的代码就是浅度复制,后面的为深度复制,我们看到差别在于用本实例的MyContent.Val重新生成了实例返回给目标,测试结果为:

这里如果MyContent的成员不是一个值类型,那么我们还需要进行深度,像下面一样:

复制代码 代码如下:
public object Clone()

{

    Cloner cloned = new Cloner();

    cloned.MyContent = MyContent.Clone();

    return cloned;

}

深度复制和浅度复制就是这样,关键是创建一个新的对象实例返回去,而不是把原来的对象实例返回回去。

希望本文所述对大家的.NET程序设计有所帮助。

您可能感兴趣的文章:

  • C# 对文件与文件夹的操作包括删除、移动与复制
  • C# Bitmap 复制的小例子
  • c#根据文件大小显示文件复制进度条实例
  • C#使用SqlBulkCopy批量复制数据到数据表
  • C#进行文件读写、创建、复制、移动、删除的方法
  • C#编程自学之数据类型和变量一
  • C#编程自学之数据类型和变量二
  • C#编程自学之数据类型和变量三
  • C#装箱和拆箱原理详解
  • C#编程自学之运算符和表达式
  • C#中深度复制和浅度复制详解

本文由 华域联盟 原创撰写:华域联盟 » ASP.NET深度复制和浅度复制分析

转载请保留出处和原文链接:https://www.cnhackhy.com/55749.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部