c\#딥 복사 와 얕 은 복사 의 차이 분석 및 인 스 턴 스
얕 은 복사 란 원본 대상 과 복사 대상 이 하나의 실 체 를 공유 하 는 것 을 말 하 며 인용 변수 만 다르다(이름 이 다르다).그 중 어떤 대상 에 대한 변경 도 다른 대상 에 게 영향 을 줄 수 있다.예 를 들 어 한 사람 이 처음에 장삼 이 라 고 불 렀 는데 나중에 이사 라 고 이름 을 바 꿨 어 요.그런데 같은 사람 이에 요.장삼 이 팔 이 모자 라 든 다리 가 모자 라 든 이사 가 팔 이 모자 라 든 다리 가 모자 라 든 모두 이 사람 이 재수 가 없어 요.
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();
}
}
}
자,깊 은 복사 와 얕 은 복사 에 대해 서 는 여기까지 입 니 다.프로젝트 가 아직 끝나 지 않 았 으 니 서둘러 야 합 니 다.코드 는 항목 에 직접 복사 하여 실행 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바의 복사 메커니즘을 깊이 이해하다만약 우리new가 새로운 대상을 낸다면, 하나의 성명으로 인용하고, 그 다음에 다른 성명으로 이전 성명을 인용한다면, 마지막 결과는 이 두 성명의 변수는 같은 대상을 가리키며, 한 곳은 모두 수정될 것이다.만약 우리...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.