2013-12-12 1 views
1

http://ideone.com/U0XFO9속성이 직접 설정되어 예상되는 숫자를 출력하고 속성이 마지막으로 설정된 숫자와 간접적으로 설정되는 이유는 무엇입니까?

왜 속성이 직접 예상 번호와 간접적으로 마지막 세트 수를 같게 설정 속성을 출력 설정? 모든 코드에 사과드립니다.하지만 실제 코드의 차가운 버전입니다.

다음 코드 출력 :

1 // 9 
2 // 9 
3 // 9 
4 // 9 
5 // 9 
6 // 9 
7 // 9 
8 // 9 
9 // 9 

는 출력한다 : 문제는 여기

1 // 1 
2 // 2 
3 // 3 
4 // 4 
5 // 5 
6 // 6 
7 // 7 
8 // 8 
9 // 9 

코드

using System; 
using System.Collections.Generic; 

public class Test 
{ 
    public static void Main() 
    { 
     int x = 0; 

     example original_example = new example(0); 

     List<example> examples = new List<example>(); 

     while (++x < 10) 
     { 
      examples.Add(new example(original_example, x)); 
     } 

     foreach(example _example in examples) 
      Console.WriteLine(_example.number1 + " // " + _example.number2); 

    } 

    public class example 
    { 
     public int number1; 
     public int number2 { get { return (int)values["number"]; } } 
     public bool original = true; 

     Dictionary<string, object> values = new Dictionary<string,object>(); 

     public example(int number) 
     { 
      original = true; 
      number1 = number; 
      values.Add("number", number); 
     } 

     public example(example original_example, int number) 
     { 
      original = false; 
      values = original_example.values; 
      values["number"] = number; 
      number1 = number; 
     } 
    } 
} 
+0

"values ​​= original_example.values"할 때 original_example에서 사전 인스턴스를 공유하므로 모든 개체에 대해 단일 값을 가진 하나의 사전이 있습니다. – fsimonazzi

답변

1

입니다 : 우리는 메모리를 할당 values = original_example.values;

에이 참조 유형 Dictionary<string, object>의 ddress를 메모리의 동일한 주소를 가리키는 새 변수에 추가합니다. 이 새로운 변수에 대한 업데이트는 동일한 객체에 영향을줍니다.

대신 원하는 결과를 얻으려면 사전을 복사하십시오. 이것은 새로운 사전을 생성하고 cstor에 원본을 전달하여 수행 할 수 있습니다

 public example(example original_example, int number) 
     { 
      original = false; 
      values = new Dictionary<string, object>(original_example.values);//Copy 
      values["number"] = number; 
      number1 = number; 
     } 

MSDN는 참조 유형의 항목에 대한 자세한 정보가 있습니다. 관련 주제 reference types vs value types도 참조하십시오.

+0

+1 감사합니다. 나는 원래의 것을 수정하고 있다는 것을 몰랐다. 이상합니다. 이것은 잘 작동하고 이미 테스트를 마쳤습니다. 그러나 이것에 대한 대안이 있습니까? – iambriansreed

+1

@ iambriansreed - 메모리의 주소 인 참조 유형 값의 사본으로 작업하고 있습니다. 그래서 당신은 같은 대상을 수정하고 있습니다. 어떤 대안을 찾고 있는지 잘 모르겠습니다. 솔루션의 문제점은 무엇입니까? –

+0

다시 한번 감사드립니다. 참조 문제로 혼란 스럽다. 당신이 나를 가리킬 수있는 문서가 있습니까? – iambriansreed

관련 문제