深度复制 与 浅度复制

1.使用受保护的方法System.Object.MemberwiseClone()进行浅度复制。
方法如下:
public   class  Cloner
ExpandedBlockStart.gifContractedBlock.gif        
{
            
public int Val;

            
public Cloner(int newVal)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Val
=newVal;
            }


            
public object GetCopy()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return MemberwiseClone();
            }

        }

假定有引用类型的字段,而不是值类型的字段(例如,对象):
public   class  Content
ExpandedBlockStart.gifContractedBlock.gif        
{
            
public int Val;
        }


        
public   class  Cloner
ExpandedBlockStart.gifContractedBlock.gif        
{
            
public Content MyContent=new Content();

            
public Cloner(int newVal)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                MyContent.Val
=newVal;
            }


            
public object GetCopy()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
return MemberwiseClone();
            }

        }
此时,通过GetCopy()得到的浅度复制有一个字段,它引用的对象与源对象相同。
下面的代码使用这个类来说明这一点:
  Cloner mySource=new Cloner(5);
  Cloner myTarget=(Cloner)mySource.GetCopy();
  Console.WriteLine("myTarget.MyContent.Val={0}",myTarget.MyContent.Val);
  mySource.MyContent.Val=2;
  Console.WriteLine("myTarget.MyContent.Val={0}".myTarget.MyContent.Val);
第4行把一个值赋给MySource.MyContent.Val,源对象中公共域MyContent的公共域Val也改变了myTarget.MyContent.Val的值。这是因为mySource.MyContent引用了与myTarget.My.Content相同的对象实例。
上述代码的结果如下:
myTarget.MyContent.Val=5;
myTarget.MyContent.Val=2;
为了说明这个过程,需要执行深度复制。修改上面的GetCopy()方法就可以进行深度复制,但最好使用.Net FrameWork的标准方式。为此,实现ICloneable接口,该接口有一个方法Clone(),这个方法不带参数,返回一个对象类型,其签名和上面使用的GetCopy()方法相同。
修改上面使用的类,可以使用下面的深度复制代码:

        
public   class  Content
ExpandedBlockStart.gifContractedBlock.gif        
{
            
public int Val;
        }


        
public   class  Cloner:ICloneable
ExpandedBlockStart.gifContractedBlock.gif        
{
            
public Content MyContent=new Content();

            
public Cloner(int newVal)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                MyContent.Val
=newVal;
            }


            
public object Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Cloner clonedCloner
=new Cloner(MyContent.Val)
                
return clonedCloner();
            }

        }
其中使用包含在源Cloner对象(MyContent)中的Content对象的Val字段,创建一个新Cloner对象。这个字段是一个值类型,所以不需要深度复制。
使用与上面类似的代码测试浅度复制,但使用Clone()而不是GetCopy(),得到如下结果:
myTarget.MyContent.Val=5
myTarget.MyContent.Val=5
这次包含的对象是独立的。
注意有时在比较复杂的对象系统中,调用Clone()是一个递归过程。例如,如果Cloner类的MyContent域也需要深度复制,就要使用下面的代码:
public   class  Cloner:ICloneable
ExpandedBlockStart.gifContractedBlock.gif        
{
            
public Content MyContent=new Content();

            .

            
public object Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                Cloner clonedCloner
=new Cloner();
                clonedCloner.MyContent
=MyContent.Clone();
                
return clonedCloner;
            }

        }

这里调用了默认的构造函数,简化了创建一个新Cloner对象的方法。为了使这段代码能正常工作,还需要在Content类上实现ICloneable接口。

 

 

// 实现Clone()方法可以实现深层复制
  class  test:ICloneable
ExpandedBlockStart.gifContractedBlock.gif    
{
        
public int a;
 
ContractedSubBlock.gifExpandedSubBlockStart.gif        
ICloneable 成员#region ICloneable 成员
        
public object Clone()
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            test t 
= new test();
            t.a 
= a;
            
return t;
        }

        
#endregion

    }

    
class  Program
ExpandedBlockStart.gifContractedBlock.gif    
{
        
       
        
static void Main(string[] args)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            test t1 
= new test();
            t1.a 
= 4;
            test t2
=(test)t1.Clone();
            t2.a 
= 8;
            Console.WriteLine(t1.a);
           
        }

    }

 
// IClonable实现深度拷贝,举个例子 


public   class  TDir : IClonable 
ExpandedBlockStart.gifContractedBlock.gif

private string[] _dirs; 
private string[] _files; 

public TDir() 
ExpandedSubBlockStart.gifContractedSubBlock.gif

_dirs 
= null
_files 
= null
}
 

public object Clone() // deep copy 
ExpandedSubBlockStart.gifContractedSubBlock.gif

TDir copy 
= new TDir(); 

if (_dirs != null
ExpandedSubBlockStart.gifContractedSubBlock.gif

ArrayList list 
= new ArrayList(_dirs.Length); 
foreach (string i in _dirs) 
list.Add(i); 
copy._dirs 
= (string[])list.ToArray(typeof(string)); 
}
 

if (_files != null
ExpandedSubBlockStart.gifContractedSubBlock.gif

ArrayList list 
= new ArrayList(_files.Length); 
foreach (string i in _files) 
list.Add(i); 
copy._files 
= (string[])list.ToArray(typeof(string)); 
}
 

return copy; 
}
 
}

 
通用的克隆方法:


        /// <summary>
        /// 克隆
        /// </summary>
        /// <returns></returns>
        public object Clone()
        {
            AwbBasic tObject = new AwbBasic();

            PropertyInfo[] pTar = this.GetType().GetProperties();
            PropertyInfo[] pSour = this.GetType().GetProperties();

            foreach (PropertyInfo s in pSour)
            {
                foreach (PropertyInfo t in pTar)
                    {
                    if (s.Name == t.Name)
                    {
                        t.SetValue(tObject, s.GetValue(this, null), null);
                    }
                }

            }

            return tObject;
        }

转载于:https://www.cnblogs.com/greatandforever/archive/2008/11/05/1326916.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值