欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-18 23:36:34
本文深入浅出的分析了asp.net深度复制和浅度复制。分享给大家供大家参考。具体分析如下: 之前一直没有搞清楚深度复制和浅度复制的区别到底在哪里,今天彻底把这个东西弄懂了...

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

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

如果大家不懂值类型和引用类型的区别,请先看,本来想自己写的,但刚好看到了这篇写的非常全面,就不自己写了。

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

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

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

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

复制代码 代码如下:
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();
}

结果是:

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

我们可以看到我们通过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重新生成了实例返回给目标,测试结果为:

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

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

复制代码 代码如下:
public object clone()
{
    cloner cloned = new cloner();
    cloned.mycontent = mycontent.clone();
    return cloned;
}

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

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