C\#복사 와 깊이 복사 실현 방법

깊이 복사 와 얕 은 표 복사 의 차 이 는 얕 은 표 복 제 는 값 형식의 값 만 복사 하고 인 스 턴 스 에 포 함 된 대상 은 원래 의 인 스 턴 스 를 가리 키 는 것 이다.

 class Program
  {
    [Serializable]
    public class Car 
    {
      public string name;
      public Car(string name)
      {
        this.name = name;
      }
    }
    [Serializable]
    public class Person:ICloneable
    {
      public int id;
      public string name;
      public Car car;
      public Person()
      {
      }
      public Person(int id, string name, Car car)
      {
        this.id = id;
        this.name = name;
        this.car = car;
      }

      public Object Clone() //  ICloneable  ,      。               。                   
      {
        return this.MemberwiseClone();
      }

    }

    //            ,                    [Serializable]  。
    public static T Copy<T>(T RealObject)
    {
      using (Stream objectStream = new MemoryStream())
      {
        //   System.Runtime.Serialization                   
        IFormatter formatter = new BinaryFormatter();
        formatter.Serialize(objectStream, RealObject);
        objectStream.Seek(0, SeekOrigin.Begin);
        return (T)formatter.Deserialize(objectStream);
      }
    }  

   
    static void Main(string[] args)
    {
      Person p1 = new Person(1, "Scott", new Car("  "));
      Console.WriteLine("   :P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
      Person p2 = Copy<Person>(p1); //      
      Person p3 = p1.Clone() as Person;//    
      Console.WriteLine("  P1  ");
      p1.id = 2;
      p1.name = "Lacy";
      p1.car.name = "  ";
      Console.WriteLine("P1:id={0}----------->name={1}------>car={2}", p1.id, p1.name, p1.car.name);
      Console.WriteLine("    :P2:id={0}----------->name={1}------>car={2}", p2.id, p2.name, p2.car.name);
      Console.WriteLine("    :P3:id={0}----------->name={1}------>car={2}", p3.id, p3.name, p3.car.name);
      Console.ReadKey();

    }
실행 결과:

1.List대상 의 T 가 값 형식 인 경우(int 형식 등)
값 형식의 List 는 다음 과 같은 방법 으로 복사 할 수 있 습 니 다.

List<T> oldList = new List<T>(); 
oldList.Add(..); 
List<T> newList = new List<T>(oldList); 
2.List대상 의 T 는 참조 형식의 경우(예 를 들 어 사용자 정의 실체 클래스)
1.인용 형식의 List 는 상기 방법 으로 복사 할 수 없고 List 의 대상 의 인용 만 복사 할 수 있 으 며 다음 확장 방법 으로 복사 할 수 있 습 니 다.

static class Extensions 
 { 
     public static IList<T> Clone<T>(this IList<T> listToClone) where T: ICloneable 
     { 
         return listToClone.Select(item => (T)item.Clone()).ToList(); 
     } 
 //<SPAN style="COLOR: #000000">     List       ICloneable  </SPAN>
 } 

2.다른 하 나 는 직렬 화 된 방식 으로 인용 대상 에 대해 깊 은 복사 본 을 완성 하 는데 이런 방법 이 가장 믿 을 만하 다.

public static T Clone<T>(T RealObject) 

{ 
   using (Stream objectStream = new MemoryStream()) 
   { 
      //   System.Runtime.Serialization                 
       IFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(objectStream, RealObject); 
       objectStream.Seek(0, SeekOrigin.Begin); 
       return (T)formatter.Deserialize(objectStream); 
   } 
} 

3.System.Xml.Serialization 을 이용 하여 직렬 화 와 반 직렬 화 를 실현 한다.

public static T Clone<T>(T RealObject) 
{ 
      using(Stream stream=new MemoryStream())
      {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        serializer.Serialize(stream, RealObject);
        stream.Seek(0, SeekOrigin.Begin);
        return (T)serializer.Deserialize(stream);
      }
}

이상 의 이 C\#복사 와 심도 있 는 복 제 를 실현 하 는 방법 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 에 게 참고 가 되 고 저희 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기