C#의 깊이 및 얕은 복사
얕은 복사란 대상의 수치 형식의 필드를 새로운 대상에 복사하는 것을 가리키며, 대상의 인용형 필드는 대상의 인용을 복제하는 것을 가리킨다.대상 객체의 참조 필드 값을 변경하면 원래 객체에 반영됩니다. 즉, 원래 객체에 해당하는 필드도 변경됩니다.
심층 복사와 얕은 복사는 인용에 대한 처리가 다르다. 심층 복사는 새로운 대상에 원시 대상과 대응하는 필드가 같은 필드를 만들 것이다. 즉, 이 인용과 원시 대상의 인용이 다르기 때문에 우리는 새로운 대상의 이 필드를 바꿀 때 원시 대상에 대응하는 필드의 내용에 영향을 주지 않는다.
그래서 원형 모델(prototype pattern)에도 서로 다른 두 가지 처리 방법이 있는데 그것이 바로 대상의 얕은 복사와 깊은 복사이다.
MemberwiseClone 메서드는 새 객체를 만들고 현재 객체의 비정상적인 필드를 새 객체로 복사하는 간단한 테이블 복사본을 만듭니다.필드가 값 유형인 경우 필드를 한 위치씩 복사합니다.필드가 인용 유형이라면 인용을 복제하지만 인용을 복제하지 않는 대상;따라서 원시 대상과 복본은 같은 대상을 인용한다.깊이 복사, 즉 ICloneable 인터페이스를 실현한다.ICloneable는 깊이 복사와 얕은 복사에 사용할 수 있습니다.
.net은 ICloneable 인터페이스를 제공합니다. 이 인터페이스 아래에 Clone () 방법이 있습니다. 깊이 복제하거나 얕은 복제를 실현할 수 있습니다. MemberwiseClone () 은 Object 클래스의 얕은 복제를 실현하는 방법입니다.
다음은 깊이 있는 복사와 얕은 복사의 모델입니다. 참고만 하십시오
[Serializable] public class InvoiceDetailResponse : IDeepCopy, IShallowCopy { public Guid merchant_id { get; set; } ///
/// /// public string uname { get; set; } ///
/// /// ///
public object ShallowCopy() { return this.MemberwiseClone(); } /// /// 【 , , 】, /// ///
public object DeepCopy() { using (MemoryStream stream = new MemoryStream()) { BinaryFormatter bFormatter = new BinaryFormatter(); bFormatter.Serialize(stream, this); stream.Seek(0, SeekOrigin.Begin); return (InvoiceDetailResponse)bFormatter.Deserialize(stream); } } } /// /// /// interface IDeepCopy { object DeepCopy(); } ///
/// /// interface IShallowCopy { object ShallowCopy(); }
public static T DeepCopyByReflection(T obj)
{
if (obj is string || obj.GetType().IsValueType)
return obj;
object retval = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = obj.GetType().GetFields(BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Static|BindingFlags.Instance);
foreach(var field in fields)
{
try
{
field.SetValue(retval, DeepCopyByReflection(field.GetValue(obj)));
}
catch { }
}
return (T)retval;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.