2013-04-11 2 views
2

이것은 내가 사전을 복사하는 것에 대해 이해한다고 생각한 것에 반하는 것입니다. 말, 나는 다음과 같은 코드를 가지고 : 나는 복사 사전을 변경 나는 원래 하나를 변경하지 않을 것이라고 예상하고 있었다예기치 않은 복사 결과

public class MyClass 
{ 
    public string str1; 

    public MyClass(string s) 
    { 
     str1 = s; 
    } 
} 

Dictionary<string, MyClass> dic1 = new Dictionary<string, MyClass>(); 
dic1.Add("0", new MyClass("hello")); 

//Make 'dic2' as a copy of 'dic1' 
Dictionary<string, MyClass> dic2 = new Dictionary<string, MyClass>(dic1); 

//Alter 'dic1' 
dic1.ElementAt(0).Value.str1 += "!!!"; 

//I was expecting dic2 not to be altered, but IT IS! 
Debug.Assert(dic2["0"].str1.Equals(dic1["0"].str1, StringComparison.Ordinal) == false);  //Result is true for equality 

을하지만 내 코드의 경우되지 않습니다.

내가 뭘 잘못하고 있니?

+2

구글 힌트 : 깊은 copy''대'얕은 copy'합니다. 실제 개체가 아닌 참조를 복사하고 있습니다. – Corak

+0

[매개 변수 전달] (http://www.yoda.arachsys.com/csharp/parameters.html)에 대한 Jon Skeets 기사도 참조 할 수 있습니다. – Default

+0

@Default : 더 잘 문서화 되었으면 좋겠습니다. 나는이 방법을 사용하기 시작했다. "C# copy dictionary"를 검색 한 후에 내 전체 사전이 복사되었다고 생각했다. – c00000fd

답변

3

Corak이 말했듯이, 당신은 얕은 사본을 만들었습니다. 객체 자체가 아니라 메모리에있는 객체에 대한 참조를 복사하고 있습니다. 이제 각 키에 대해 하나의 객체에 대한 참조가 두 개 있습니다. 당신이 원하는 무엇

은 딥 카피 여기를 참조 : What is the best way to clone/deep copy a .NET generic Dictionary<string, T>?

+0

감사합니다. 그것은 다소 혼란 스럽지만. 분명히 사전은 중첩 될 수 있으므로 "중첩 된"사전이 "딥 복사"를 수행 할 때 상위 사전에서 "얕은 사본"을 작성하면 어떨까요? – c00000fd

+0

사전은 키를 값으로 매핑합니다. 값은 객체가 아닌 참조입니다. C#이 작동하는 방식 일뿐입니다. 값은 구조체 일 수 있습니다.이 경우 구조가 다르게 작동 할 수 있습니다 (몇 년이 지났지 만 조금 흐릿합니다). – Joe

+0

중첩 된 사전에 대해서는 사용자가 직접 복사 방법을 구현해야한다고 생각합니다. – Joe