2012-06-21 3 views
0

모두 :C에서 복사하지 않고 2 개의 사전 개체를 교환하는 방법

2 개의 사전 개체 d1과 d2가 있습니다. 그것들은 처음에는 따로 생성되고, 내용은 별도로 추가됩니다. 일부 처리 후 다음 작업을 수행하려고합니다.

  • d1 참조 d2;
  • 새 개체에 대한 d2 참조를 만듭니다.

내가이 일을 수행하는 C#을 초보자이고 유일한 방법을 검색 할 수 있습니다 :

d1 = new Dictionary<int, int>(d2); 
d2 = new Dictionary<int, int>(); 

나는 아래처럼, C++ 방식처럼 더 효율적으로 할 수 있습니까? 의사 코드 :

d1 = d2; 
d2 = new Dictionary<int, int>(); 

감사합니다.

+0

은'새로운 사전 (D2)는 '통화 실제로 사전 복사 부재 위에 새로운 인스턴스를 생성한다. 이렇게하면 새 객체 참조가 만들어 지므로 (newD1! = oldD2) 의도 한 것과 다를 수 있습니다. – Dai

+0

@David 콘텐츠가 동일하면 괜찮습니다. 그런데,이 카피는, KeyValuePair 오브젝트의 카피 참조만을 의미하는 깊고 얕은 것입니까? – Sheen

+1

딥 카피입니다. 레드 게이트 리플렉터 (필수 도구)에 따르면 생성자는 각 KeyValuePair 인스턴스에 대해 반복적으로 newDict.Add (pair.Key, pair.Value)를 호출하므로 키와 값의 딥 복사입니다 (키 - 값 쌍 자체). – Dai

답변

3
d1 = d2; 
d2 = new Dictionary<int, int>(); 

사실이 작업을 수행합니다. 왜 이것이 작동하지 않을지 모르겠다. 사전은 참조 유형이므로 복사하지 않고 위의 작업을 수행하면 참조를 다시 할당하기 만하면됩니다.

http://msdn.microsoft.com/en-us/library/490f96s2.aspx

+0

오, 맞습니까? 나는 d1 = d2 후에 생각했다. d1과 d2는 모두 동일한 데이터 사본을 참조하며, d2를 null로 설정하면 d1이 데이터를 잃게됩니다. – Sheen

+0

아니요, 할당은 참조 포인터 만 변경합니다. –

+0

d2의 참조를 null로 설정하면됩니다. d1은 레퍼런스와 함께 머무를 것이고 가비지 컬렉터는 할당 된 메모리를 수집하지 않을 것이다. –

관련 문제