근본을 잊지 않고 얕은 복사와 깊은 복사를 하다

5258 단어 딥 카피
디렉토리로 돌아가기
Clone 분할 및 깊이 복사
양자의 차이점: 대상의 속성이 인용 유형일 때, 즉 클래스 제품에서 클래스category에 대한 인용이 있을 때 얕은 복사와 깊은 복사가 차이가 있다.
얕은 복사: 복제된 것은 category의 인용으로 원 대상이 바뀔 때 새로운 대상에 영향을 주고 반대로도 마찬가지다.
깊이 복사: 복제된 것은category의 값입니다. 즉, 새로운 category를 새 category로 만들고, 원래의 category 요소의 값을 새 요소로 복사합니다. 즉, 원본과 아무런 관계가 없고, 내용만 같습니다.
객체의 복제 기능을 수행하는 방법:
계승 인터페이스 ICloneable 구현 Clone 방법 ICloneable.Clone 자체는 구분할 수 없습니다. (Deep or Shallow) Clone에서 MemberwiseClone을 호출해서 Shallow Clone을 실현할 수도 있고, 스스로 Deep Clone을 실현할 수도 있습니다.하지만 microsoft의 조언에 따라 ICloneable를 실현할 때는 Deepclone을 실현하기 위해 준비한다.ICloneable.Clone 반환 유형은 object입니다. 여기서 MemberwiseClone의 복사 원리는 값 유형을 비트별로 복사하고 인용 유형은 대상의 인용을 복사합니다.여기서 주의해야 할 것은 바로 String 유형이다. 인용 유형이지만 여기서 표현할 때 값 유형과 똑같다. Clone에서 값 유형으로 보면 된다.
Clone 구현 방법:
1. 수동 복제
대상이 당신이 생각하는 대로 완전히 복제될 수 있도록 보장하는 방법은 수동으로 복제된 대상의 모든 필드 (field) 이다.이런 방식의 단점은 번거롭고 오류가 발생하기 쉽다는 것이다. 클래스에 영역을 추가하면 클론을 업데이트하는 방법을 잊어버릴 수도 있다.또한 복제 인용 대상이 원시 대상을 가리킬 때 무한 순환 인용을 피하는 것을 주의해야 한다.다음은 진행깊이카피의 간단한 예입니다.
 
2. MemberWiseclone 메서드 사용
MemberWiseClone는 Object 클래스의 보호 방법으로 새로운 대상을 만들고 현재 대상의 모든 비정상적인 영역을 새 대상에 복사하여 얕은 복사본을 만들 수 있습니다.값 유형의 도메인에 대해서는 비트별 복제가 수행됩니다.인용 형식의 영역에 대해 인용은 값이 부여되고 인용된 대상은 인용되지 않습니다.따라서 원본 객체와 클론은 동일한 객체를 참조합니다.이 방법은 파생 클래스에 효과가 있습니다. 즉, 기본 클래스에서 Clone 방법을 한 번만 정의하면 됩니다.다음은 간단한 예입니다.
1 public class Person : ICloneable
2 {
3     public string Name;
4     public Person Spouse;
5     public object Clone()
6     {
7         return this.MemberwiseClone();
8     }
9 }

3. 반사로 클론 만들기
반사로 복제하는 것은 Activator.CreateInstance 방법을 사용하여 같은 유형의 새로운 대상을 만들고 반사로 모든 영역을 얕게 복사하는 것이다.이 방법의 장점은 완전 자동이어서 대상에 구성원을 추가하거나 삭제할 때 클론 방법을 수정할 필요가 없다는 것이다.또 깊은 복사를 제공하는 방법으로 쓰일 수도 있다.단점은 반사를 사용했기 때문에 비교적 느리고 부분적으로 신임을 받다 환경에서는 사용할 수 없다는 것이다.예제 코드
4. 클론을 시리얼화하기
대상을 복제하는 가장 간단한 방법은 그것을 서열화하고 즉시 새로운 대상으로 반서열화하는 것이다.반사법과 마찬가지로 서열화 방법은 자동적이며 대상 구성원을 삭제할 때 수정할 필요가 없다.단점은 서열화가 다른 방법보다 느리고 심지어 반사로 하는 것보다 느리며 모든 인용 대상은 서열화되어야 한다(Serializable.또한 사용자가 사용하는 서열화된 형식 (XML, SOAP, 이진) 에 따라 개인 구성원이 기대했던 대로 복제되지 않을 수도 있습니다.예시 코드는 여기., 여기.여기.에 있다.
5. IL을 사용한 클론 복제
객체 복제에 IL(중간 언어)을 사용하는 것은 드문 해결책입니다.이런 식으로 동적 방법 (Dynamic Method) 을 만들고 중간 언어 생성기 (ILGenerator) 를 가져와 방법에 코드를 주입해서 의뢰로 컴파일한 다음 이 의뢰를 실행합니다.의뢰는 캐시되기 때문에 중간 언어는 처음 복제할 때만 생성되며 후속 복제는 다시 생성되지 않습니다.비록 이런 방법은 사용반사보다 빠르지만 이런 방법은 이해하고 유지하기 어렵다.예제 코드
6. 확장 방법을 사용하여 클론 생성
Havard Stranden은 확장 방법(extention method)으로 사용자 정의 클론 프레임을 만듭니다.이 프레임워크는 대상 구조가 아무리 복잡해도 대상과 인용된 대상의 깊은 복사를 만들 수 있다.단점은 원본 코드를 제공하지 않는 사용자 정의 프레임워크 (업데이트: 현재 원본 코드가 포함되어 있습니다. 본 논문 평론 참조) 이며, 파라미터 구조기를 사용하지 않을 때 개인적인 방법으로 만든 대상을 복사할 수 없습니다.또 다른 문제는 모든 자동화된 심층 복제 방법이 공통적으로 가지고 있는 문제이다. 심층 복제는 일반적으로 단순하고 자동화된 특수한 상황 (예를 들어 관리되지 않은 자원) 을 유연하게 처리해야 한다는 것이다.
디렉토리로 돌아가기

좋은 웹페이지 즐겨찾기