2009-08-20 3 views
2

List가 있고 .copyTo() 메서드를 사용했습니다. 그래서 그것은 내 List를 1 차원 배열로 복사합니다.C# List <myObject> myList.copyTo()가 참조를 유지합니까?

그래서이 배열을 반복하고 각 myObject를 다른 목록에 추가하면이 새 목록의 내용이 변경됩니다.

다음은 두 번째 목록의 새 값과 첫 번째 목록에있는 이전 값의 차이점을 보여줍니다. 그러나 항상 차이점은 없습니다. 그래서 copyTo() 메소드가 참조를 유지한다고 생각합니다.

참조를 보관하지 않는 다른 방법이 있습니까?

답변

8

예. .CopyTo()는 참조를 복사한다는 의미의 얕은 복사본을 수행합니다. 필요한 것은 각 개체를 복제하여 깊은 복사본입니다.

가장 좋은 방법은 각 개체에 그런 수 콜 .Clone()

public class YourClass 
{ 
    public object Clone() 
    { 
     using (var ms = new MemoryStream()) 
     { 
      var bf = new BinaryFormatter(); 

      bf.Serialize(ms, this); 
      ms.Position = 0; 

      object obj = bf.Deserialize(ms); 
      ms.Close(); 

      return obj; 
     } 
    } 
} 

IClonable

을 구현 인 myObject 클래스 당신에게하고 새로운 목록에 그를 추가하는 것입니다.

List<YourClass> originalItems = new List<YourClass>() { new YourClass() }; 
List<YourClass> newItemList = originalItems.Select(x => x.Clone() as YourClass).ToList(); 
+0

그래서 개체에 IClonable을 추가해야합니까? 그런 다음 복제 방법을 사용 하시겠습니까? – Gerbrand

+0

'IClonable'을 사용하지 말고 깊은 복사본 –

+0

@ 존을 사용하는 자신의 메서드를 작성하십시오. 그게 다 잘 됐어. 편집 됨. –

2

참조 유형 목록이 있고 CopyTo 메서드를 사용하여 배열에 복사하는 경우 목록의 내용이 으로 복사되므로 목록의 내용을 복사 할 때 귀하의 배열, 그들은 여전히 ​​귀하의 목록에서 참조되는 힙에 동일한 개체를 참조합니다.

+0

저의 경우입니다. 이에 대한 다른 해결책이 있습니까? – Gerbrand

관련 문제