2

내 의도는 TCP 스트림을 통해 목록을 비동기 적으로 보내는 것입니다. 그러나 비동기 스레드에 목록을 전달한 직후에 새로운 데이터로 다시 채우기 위해 지울 필요가 있습니다. 그래서 목록의 복사본을 생성하고, 백그라운드 스레드에 전달하는 얕은 복제를 사용 :원본 목록이 지워진 경우 얕은 복제 목록 내부의 항목은 어떻게됩니까

private List<MyDataObject> GetShallowCloneOfDataList(List<MyDataObject> dataEvents) 
{ 
    return new List<MyDataObject>(dataEvents); 
} 

을 여기 내 마지막 코드입니다 : 나는을 취소 할 때

List<MyDataObject> data = new List<MyDataObject>(); 
while(hasMoreData) 
{ 
    data.clear(); 
    FillListFromServer(data); 
    List<MyDataObject> clonedList = GetShallowCloneOfDataList(data); 
    Task.Run(() => SendDataList(clonedList)); 
} 

내 질문입니다 원래 목록 data, 복제 된 목록의 항목도 영향을 받습니까? 내 코드를 테스트 한 결과 영향을받지는 않지만 많은 양의 데이터 (초당 200K)를 처리 할 때 이것이 사실인지 확실하지 않습니다.

+0

참조 유형이 무엇입니까? – mybirthname

+0

질문 (아래 답변 됨) 외에도 SendDataList에 목록의 복제본을 전달한 다음 자체 목록을 지우는 이유는 무엇입니까? 원래 목록을 기능에 전달하지 않으려면이 원래 목록을 더 이상 터치하지 않고 새 목록을 작성하십시오. 훨씬 더 효율적이지 않나요? –

+0

@HaraldCoppoolse, 네, 실제로 이것은 더 효율적입니다.하지만 불행히도 상황은 위에서 보여준 코드 스 니펫보다 훨씬 복잡합니다. 원래 목록은 데이터 서버에서 푸시 된 이벤트가 발생할 때 새 데이터로 채울 관찰자 클래스에 응용 프로그램의 시작에 연결되므로 새 목록을 만드는 것은 옵션이 아닙니다. ( –

답변

4

아니요, 기존 항목은 가비지 수집 대상이 될 수있는 것 외에는 영향을받지 않습니다.

MyDataObject x = new MyDataObject(); // And populate 
MyDataObject y = x; // Just copy the reference 
x = null; // This doesn't change either y or the data in the object 

당신이 당신의 친구와 가족의 주소를 가득 주소록이 있다면 그것이 대해 생각하는 또 다른 방법은 다음 불에 던져 :

이건 그냥 변수를 설정처럼 효과적으로 null로한다 ... 당신은 당신의 친구 및 가족이 더 이상 어디에 있는지를 알 수 없지만 그들이 살았던 곳에서는 변하지 않을 것입니다. (이런 종류의 비유에 대한 자세한 내용은 this answer을 참조하십시오.)

+0

그래서 나는 모든 원본 항목을 지운 후에도 원래 항목은 여전히 ​​복제 목록에 있습니다. 그리고 보낼 때 데이터를 잃지 않겠습니까? –

+1

@HassanMokdad : 예, 실제로 같은 개체를 참조하는 두 개의 독립적 인 컬렉션이 있습니다. 두 개의 주소록 같은 주소 세트를 가지고 있습니다. 그 중 하나에서 모든 주소를 지우는 것은 주택이나 다른 주소록을 수정하지 않습니다. –

+0

좋은 예를 주셔서 감사합니다 :) –

1

이렇게 생각해 봅시다. 메모리에 객체가 있고 각 색인이 이러한 객체 중 하나를 메모리에서 참조하는 목록이 있습니다.

당신은 당신이 지워 이제 인덱스 0

에서 목록 2의 기준과 동일 인덱스 0 목록 1의 참조가 동일한 인덱스에서 같은 객체를 참조하는 새 목록을 만들하기로 결정 첫 번째 목록 (두 번째 목록의 존재에 대해 알지 못함). 두 번째 목록은 그대로 유지됩니다! 항목 수는 여기에 차이가 없습니다.

주의해야 할 점은 MyDataObjectclass이고 struct이 아닌 경우 목록에서 항목의 속성을 변경하면 다른 항목에서 변경됩니다. 예 :

data[0].Foo = 12; 
Console.WriteLine(clonedList[0].Foo); // prints 12 

그러나 표시된 코드에서이 작업을 수행하지 않는 것 같습니다. 미래에 직면 한 경우를 대비해서

+0

이것을 해결해 주셔서 감사합니다 :) –