C# 객체 복제

3056 단어 c#
우리가 작업할 때 자주 대상 복제에 사용된다. 예를 들어 A 대상이 원래의 대상이고 A 대상이 B 대상에게 값을 부여하고 원래의 데이터를 기록한 다음에 A 대상에 대해 값을 바꾸기 시작한다. 이어서 A 대상이 그 값을 바꾸면 먼저 이렇게 쓴다는 것을 알고 싶다.
A a = new A();
a.ID = 10;
a.Name = "jacky";

A b = a;

a.ID = 11;
a.Name = "zhuovi";

그리고 결과는 우리가 원하는 것이 아니다. ab 두 대상의 값이 모두 바뀌었다.두 가지 대상 복제 방법이 있는데 그것이 바로 얕은 복사와 깊은 복사이다.얕은 복사는 인용만 복제할 뿐 인용의 대상은 복제하지 않습니다.깊이 복사는 인용된 대상을 복제합니다.원시 대상의 인용과 얕은 복사 대상의 같은 인용은 모두 같은 대상을 가리킨다.깊이 복사된 대상은 대상의 모든 직간접적인 인용을 포함한다.다음은 내가 자주 쓰는 두 가지 방법을 제시한다.MemberWiseClone MemberWiseClone은 Object 클래스의 보호 방법입니다. 새 대상을 만들고 현재 대상의 모든 비정상적인 영역을 새 대상에 복사해서 얕은 복사본을 만들 수 있습니다.값 유형의 도메인에 대해서는 비트별 복제가 수행됩니다.인용 형식의 영역에 대해 인용은 값이 부여되고 인용된 대상은 인용되지 않습니다.따라서 원본 객체와 클론은 동일한 객체를 참조합니다.이 방법은 파생 클래스에 효과가 있습니다. 즉, 기본 클래스에서 Clone 방법을 한 번만 정의하면 됩니다.다음은 간단한 예입니다.
public class A{
    public int ID{get;set;}
    public string Name{get;set;}
    public A Clone(){
        return this.MemberWiseClone() as A;
    }
}

2. 반사로 클론 직접 부호화
System.Reflection.PropertyInfo[] pA = A.GetType().GetProperties();
System.Reflection.PropertyInfo[] pB = A.GetType().GetProperties();
for (int i = 0; i < pA.Length; i++)
{
    if(pB[i].CanWrite)
    pB[i].SetValue(this, pA[i].GetValue(A, null));
}

이제 또 하나는 수동 할당이야.

좋은 웹페이지 즐겨찾기