• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    ASP.NET深度复制和浅度复制分析

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

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

    如果大家不懂值类型和引用类型的区别,请先看https://www.jb51.net/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中索引器的用法分析
    下一篇:ASP.NET显示农历时间的方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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