c\#딥 복사 와 얕 은 복사 의 차이 분석 및 인 스 턴 스

딥 복사 란 원본 대상 과 복사 대상 이 서로 독립 되 는 것 을 말 하 는데 그 중에서 그 어떠한 대상 의 변경 도 다른 대상 에 게 영향 을 주지 않 는 다.예 를 들 어 한 사람의 이름 은 장 삼 이 고 나중에 그 로 다른 사람 을 복제 했다.이 사 는 장 삼 이 팔 이 부족 하 든 다리 가 부족 하 든 이사 가 팔 이 부족 하 든 다리 가 부족 하 든 다른 사람 에 게 영향 을 주지 않 을 것 이다.비교적 전형 적 인 것 은 Value(값)대상 이다.예 를 들 어 미리 정 의 된 유형 Int 32,Double,그리고 구조(struct),매 거 진(Enum)등 이다.
      얕 은 복사 란 원본 대상 과 복사 대상 이 하나의 실 체 를 공유 하 는 것 을 말 하 며 인용 변수 만 다르다(이름 이 다르다).그 중 어떤 대상 에 대한 변경 도 다른 대상 에 게 영향 을 줄 수 있다.예 를 들 어 한 사람 이 처음에 장삼 이 라 고 불 렀 는데 나중에 이사 라 고 이름 을 바 꿨 어 요.그런데 같은 사람 이에 요.장삼 이 팔 이 모자 라 든 다리 가 모자 라 든 이사 가 팔 이 모자 라 든 다리 가 모자 라 든 모두 이 사람 이 재수 가 없어 요.
      C\#에는 두 가지 유형 변수 가 있 는데 하 나 는 값 유형 변수 이 고 하 나 는 인용 유형 변수 입 니 다.전자 에 대해 copy 는 전체 복사 에 속 합 니 다.후자 에 대해 일반적인 copy 는 얕 은 copy 일 뿐 인용 지침 만 전달 하 는 것 과 같다.따라서 후자 가 진정한 copy 를 할 때 도 가장 힘 들 고 구체 적 으로 ICloneable 인터페이스 에서 제공 하 는 Clone 방법 을 실현 해 야 한다.
정의 보기:      얕 은 복사(그림자 복제):대상 의 기본 유형 만 복사 하고 대상 유형 은 원래 의 참조 에 속 합 니 다.      딥 복사(딥 복제):복제 대상 의 기본 클래스 에 신경 쓰 지 않 고 원래 대상 의 대상 도 복제 합 니 다.즉,완전히 새로운 대상 이 생 긴 것 입 니 다.
얕 은 복사 와 깊 은 복사 의 차이      얕 은 복사 란 대상 의 수치 형식의 필드 를 새로운 대상 에 복사 하 는 것 을 말 하 며,대상 의 인용 형 필드 는 대상 에 대한 인용 을 복사 하 는 것 을 말한다.대상 에서 인용 형 필드 의 값 을 바 꾸 면 원래 대상 에 반 영 됩 니 다.즉,원시 대상 에서 대응 하 는 필드 도 달라 집 니 다.깊 은 복사 와 얕 은 복사 가 다른 것 은 인용 에 대한 처리 입 니 다.깊 은 복 사 는 새로운 대상 에서 원래 대상 과 대응 하 는 필드 가 같은 필드 를 만 들 것 입 니 다.즉,이 인용 은 원래 대상 의 인용 과 다 릅 니 다.우 리 는 새로운 이미지 의 이 필드 를 바 꿀 때 원래 대상 에서 대응 하 는 필드 의 내용 에 영향 을 주지 않 습 니 다.그래서 원형 모델 에 대해 서도 서로 다른 두 가지 처리 방법 이 있다.대상 의 얕 은 복사 와 깊 은 복사 이다.
다음은 실례 를 통 해 얕 은 복사 와 깊 은 복사 의 차 이 를 똑똑히 볼 수 있다.코드 는 다음 과 같다.

using System;
 using System.Collections.Generic;
 using System.Text;

 namespace WindowsApplication1
 {
     class Program
     {
         public class Sex
         {
             private string _PSex;
             public string PSex
             {
                 set
                 {
                     _PSex = value;
                 }
                 get
                 {
                     return _PSex;
                 }
             }

         }

         public class Person : ICloneable
         {

             private Sex _pSex = new Sex();
             public int aa = 1213;

             public string pSex
             {
                 set
                 {
                     _pSex.PSex = value;
                 }
                 get
                 {
                     return _pSex.PSex;
                 }
             }
             private string _PName;
             public string PName
             {
                 set
                 {
                     this._PName = value;
                 }
                 get
                 {
                     return this._PName;
                 }
             }

             public void ShowPersonInfo()
             {
                 Console.WriteLine("-------------------------");
                 Console.WriteLine("Name:{0} Sex:{1}", _PName, this.pSex);
                 Console.WriteLine("-------------------------");
                 Console.WriteLine(this.aa);
             }
             //
             public object Clone()
             {
                 return this.MemberwiseClone();
             }
             //
             public object DeepClone()
             {
                 Person newP = new Person();
                 newP.PName = this._PName;
                 newP.pSex = this.pSex;
                 return newP;
             }

         }

         static void Main(string[] args)
         {
             Console.WriteLine(" :");
             Person p = new Person();
             p.PName = "JackLee";
             p.pSex = " ";

             p.ShowPersonInfo();

 
             //        
             Person copy = (Person)p.Clone();
             //
             Person dcopy = (Person)p.DeepClone();

 
             Console.WriteLine(" :");
             p.PName = "JackZhao";
             p.pSex = " ";
             p.aa = 1111;
             p.ShowPersonInfo();

 
             Console.WriteLine(" :");
             copy.ShowPersonInfo();
             Console.WriteLine(" :");
             dcopy.ShowPersonInfo();

             Console.WriteLine(" :");
             Person PP = p;
             PP.ShowPersonInfo();

             Console.ReadLine();

 
         }

     }
 }
자,깊 은 복사 와 얕 은 복사 에 대해 서 는 여기까지 입 니 다.프로젝트 가 아직 끝나 지 않 았 으 니 서둘러 야 합 니 다.코드 는 항목 에 직접 복사 하여 실행 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기