Список, который всегда содержит текущее значение переменной.C # - PullRequest
0 голосов
/ 26 октября 2011

Так что мне нужен список (или аналогичная структура данных), который всегда содержит текущее значение для данной переменной, как только оно было добавлено.Это то, что происходит в настоящее время (в более простом / псевдокоде):

intValue = 5;
intList.Add(intValue);

Print intList[0].toString();

Печатает "5"

intValue++;
Print intList[0].toString();

Still Печатает "5", когда я хочу напечатать новое значение intValue,"6".

По сути, список должен хранить ссылку на intValue (я думаю, что это правильная терминология), а не его фактическое значение.Спасибо за ваше время.

Ответы [ 4 ]

8 голосов
/ 26 октября 2011

Ваш вопрос очень похож на следующее:

Как получить список изменяемых строк?

Измените реализацию SortOfMutableString в принятом ответе, чтобы сохранить int значения вместо string, и вы получите желаемый эффект.

Кроме того, проверьте ответ Джона Скита там. Это очень важно, чтобы полностью понять последствия такого рода решений.

3 голосов
/ 26 октября 2011

Это потому, что в C # int является типом значение вместо типа reference .Когда вы пишете

intValue = 5;
intList.Add(intValue);

, вы добавляете copy в intValue, а не ссылку на саму переменную.Вам нужно добавить ссылку на переменную intValue в intList.Что вы можете сделать, это обернуть ваши значения int в собственный класс (который является ссылочным типом).

3 голосов
/ 26 октября 2011

Это не то, что можно сделать, изменив тип списка.Возможно, вам придется создать свой собственный ссылочный тип, который будет вести себя как int.net структуры не являются ссылочными типами, поэтому с ними невозможно получить такое поведение, как вам нужно.

Вы должны понимать, что int, который вы добавили в свой список, является просто копией, поэтому любойизменение источника не повлияет на копию.

1 голос
/ 27 октября 2011

Поскольку вам нужно хранить ссылку вместо значения переменных, вы можете хранить указатели.Вам нужно будет использовать ключевое слово unsafe, чтобы использовать указатели в C #.

  unsafe
  {
    int intVal=5;
    List<IntPtr> intList = new List<IntPtr> ( );
    intList.Add ( new IntPtr ( &intVal ) );
    MessageBox.Show ( ( *( ( int* ) ( intList[0].ToPointer ( ) ) ) ).ToString ( ) );
    intVal++;
    MessageBox.Show ( ( *( ( int* ) ( intList[0].ToPointer ( ) ) ) ).ToString ( ) );
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...