Сопоставление указателей на неизменяемые объекты с помощью Hashtable в .NET

У меня есть объект Hashtable, который «именует» или «сопоставляет» различные поля в классе со строкой

ref class Interrupt{
  Interrupt(){
    this->type = 0;
    this->size = 0;
  }
  int type;
  int size;
}

Interrupt^ interrupt = gcnew Interrupt();

Hashtable^ map = gcnew Hashtable();
map->Add("InterruptType", interrupt->type);
map->Add("InterruptSize", interrupt->size);

этот класс изменяется во время выполнения, поэтому тип и размер равны 2.

дальше по дороге я запрашиваю свою Hashtable, но значения не изменились. Я понимаю, что это потому, что они неизменны. Есть ли способ указать свою Hashtable для хранения указателей на поля моего класса вместо сохранения значения ссылки?

Я знаю, что могу изменить класс Interrupt для хранения пользовательских объектов вместо необработанных int, но это потребует МНОГО рефакторинга.


person Eric    schedule 19.08.2009    source источник


Ответы (3)


Я понимаю, что это потому, что они неизменны.

Вы понимаете неправильно. Да, целые числа неизменяемы. Но значения карты не изменились, потому что целые числа являются типами значений и поэтому передавались в метод карты Add() по значению. Другими словами, карта содержит копию значения, переданного методу Add(), а не ссылку на переменную, переданную в метод.

Чтобы исправить это, вам нужно обернуть ваши целые числа в ссылочный тип (класс) и дать карте ссылку на желаемый экземпляр этого класса. Затем убедитесь, что всякий раз, когда вы меняете свои целые числа, вы меняете их как члены правильного экземпляра.

person Joel Coehoorn    schedule 19.08.2009

Вы можете изменить его, чтобы ваша Hashtable просто содержала ссылку на ваш класс (прерывание) вместо отдельных значений int. Таким образом, вы можете искать значения int на основе экземпляра.

person Reed Copsey    schedule 19.08.2009
comment
Хорошая идея, однако для этого потребуется большой оператор, подобный переключателю, для обработки нескольких полей. - person Eric; 19.08.2009
comment
Эрик: В этом случае может быть проще просто создать пользовательский класс, предоставляющий определенный доступ, который вам нужен, вместо использования хеш-таблицы. Класс может содержать хэш-таблицу и соответствующим образом обрабатывать переключение. - person Reed Copsey; 19.08.2009

Если вы использовали словарь и передали адрес члена, он будет работать ... до тех пор, пока объект прерывания будет закреплен. Однако, поскольку Interrupt является ref-классом, это также потребовало бы большой работы. Я искренне думаю, что вам лучше всего сейчас стиснуть зубы и провести рефакторинг, поскольку это кажется правильным.

person Harper Shelby    schedule 19.08.2009