2013-12-12 2 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», поэтому есть один словарь с одним значением для всех объектов. – fsimonazzi

ответ

1

вопрос находится здесь: values = original_example.values;

Зададим памятьddress ссылочного типа Dictionary<string, object> на новую переменную, указывающую на тот же адрес в памяти. Любые обновления, сделанные этой новой переменной, влияют на один и тот же объект.

Вместо этого для достижения желаемого результата скопируйте словарь. Это может быть сделано путем создания нового словаря и передачи оригинала в 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

Смежные вопросы