C#의 깊이 및 얕은 복사

6709 단어
얕은 복사와 깊은 복사 사이의 차이점:
얕은 복사란 대상의 수치 형식의 필드를 새로운 대상에 복사하는 것을 가리키며, 대상의 인용형 필드는 대상의 인용을 복제하는 것을 가리킨다.대상 객체의 참조 필드 값을 변경하면 원래 객체에 반영됩니다. 즉, 원래 객체에 해당하는 필드도 변경됩니다.
심층 복사와 얕은 복사는 인용에 대한 처리가 다르다. 심층 복사는 새로운 대상에 원시 대상과 대응하는 필드가 같은 필드를 만들 것이다. 즉, 이 인용과 원시 대상의 인용이 다르기 때문에 우리는 새로운 대상의 이 필드를 바꿀 때 원시 대상에 대응하는 필드의 내용에 영향을 주지 않는다.
그래서 원형 모델(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;
}

좋은 웹페이지 즐겨찾기