Deep Copy VS Shallow Copy

3038 단어
우선 저희가 뭘 알아야 되는지.

심층 복사와 얕은 복사


얕은 복사: 대상의 기본 형식만 복사하고 대상 유형은 원래의 인용에 속합니다
딥 카피: 객체의 기본 클래스뿐만 아니라 원래 객체의 객체도 복제합니다.
 
C#에는 두 가지 유형의 변수가 있는데 하나는 값 유형의 변수이고 하나는 인용 유형의 편리함이다. 값 유형의 편리함, 깊이 복사와 얕은 복사는 모두 복사 조작을 통해 이루어진다. 그 효과는 같다. 대상의 값 유형의 필드를 새로운 이미지로 복사한다.이것은 이해하기 쉽다.본고는 인용 유형 변수의 복사 메커니즘과 실현을 중점적으로 토론한다.

C#에서 참조 유형 객체의 Copy 작업은 두 가지입니다.


위에서 말한 두 가지이기 때문이다.

얕은 복사와 깊은 복사의 차이점:


얕은 복사란 대상의 수치 형식의 필드를 새로운 대상에 복사하는 것을 가리키며, 대상의 인용 필드는 대상의 인용을 복제하는 것을 가리킨다
 
주의:string 형식은 좀 특수합니다. 얕은 복사는 클래스 값 형식의 대상에 따라 처리됩니다.
 

간단한 복사의 실현


1 Ojbect 클래스 MemberwiseClone을 사용하여 구현
MemberwiseClone: 현재 Object의 간단한 복사본 만들기
MemberwiseClone 방법은 새 객체를 만들고 현재 객체의 비정상적인 필드를 새 객체로 복사하는 간단한 테이블 복사본을 만듭니다.필드가 값 유형인 경우 필드를 한 위치씩 복제하고, 필드가 참조 유형인 경우 참조는 복제하지만 참조된 객체는 복제하지 않습니다.따라서 원본 대상과 복사본은 같은 대상을 인용한다.
코드 예:
public class Person
    {
        public int Age { get; set; }
        public string Address { get; set; }
        public Name Name { get; set; }

        public object Clone()
        {
           return   this.MemberwiseClone();    
        }

        
    }



    public class Name
    {
        public Name(string frisName,string lastName)
        {
            FristName = frisName;
            LastName = lastName;
        }
        public string FristName { get; set; }
        public string LastName { get; set; }
    }

2 복제 작업 및 Object 클래스 MemberwiseClone 사용
인용 유형의 변수에 대해 우리는 복제 작업이 일종의 얕은 복사라고 오해하는데 사실은 차이가 있다.
1 얕은 복사본은 인용 유형 대상의 값 유형 필드를 한 위치씩 복사합니다.값 부여 연산자는 원본 대상의 인용을 목적 대상에게 주고 둘은 같은 대상을 인용한다.
2 얕은 복사된 대상의 값 유형 필드 변경은 원본 대상에 반영되지 않고, 값 연산된 대상 유형 필드 변경은 원본 대상에 반영됩니다.
 
==================================
 

심층 복제의 실현


 
얕은 복사에 비해 원본 대상을 원형으로 하고 새로운 대상을 만들어서 현재 대상의 모든 필드를 한 위치씩 복제하고 귀속을 지원합니다. 값 형식이든 인용 형식이든 정적 필드든 비정적 필드든.
C#

심층 복제를 위한 3가지 방법


1 ICloneable 인터페이스 구현, 복제 기능 사용자 정의
ICloneable 인터페이스에는 MemberwiseClone에서 제공하는 클론을 제외한 클론을 지원하는 구성원 Clone이 포함되어 있습니다.Clone은 심층 던전을 실현할 수도 있고 얕은 표면 던전으로 실현할 수도 있다. 심층 던전에서 모든 대상은 중복되고 얕은 표면 던전에서 최고급 대상만 중복되며 최고급 이하의 대상은 인용을 포함한다.결과 클론은 원래 인스턴스와 동일한 유형이어야 합니다.
2 서열화/반서열화 실현
DataSet 객체에 대한 두 가지 접근 방식을 알아봤는지 모르겠습니다.
 DataSet .Clone 메서드는 데이터를 복제하지 않고 모든 DataTable 아키텍처, 관계, 제약조건을 포함하여 DataSet의 구조를 복제합니다.
새로운 DataSet기존 DataSet과 동일한 아키텍처이지만 데이터 DataSet은 포함되지 않습니다.이미 만든 하위 클래스가 있으면 복사본도 같은 하위 클래스에 속합니다.
 
DataSet. Copy 메서드는 DataSet의 구조와 데이터를 복제합니다(관련 용어를 이해하지 못하면 이전 블로그 클릭 참조).
새로운 DataSet은 이 DataSet과 같은 구조(표 구조, 관계와 제약)와 데이터를 가지고 있다.
 
 
이 두 개는 깊이도 얕은 복사도 아니지만 결합하면 우리의 깊이 복사다.
시리얼화는 객체 또는 객체 그래픽을 선형 바이트 시퀀스로 변환하여 다른 위치에 저장하거나 전송하는 프로세스입니다.역서열화는 저장된 정보를 받아들여 다시 대상을 만드는 과정이다.ISerializable 인터페이스를 통해 클래스는 자신의 서열화 행위를 실행할 수 있습니다.
 
3 반사로 구현
 
순차적/반사적 시퀀스 방식을 통해 우리는 비교적 원활하게 깊은 복사를 실현하지만 I/O 조작과 관련된 위탁 관리 환경은 자원을 많이 소모한다.
이곳은 반사 특성을 이용한다.자세히 설명하지 않겠습니다.

좋은 웹페이지 즐겨찾기