Сопоставление указателей с неизменяемыми объектами с помощью Hashtable в .NET - PullRequest
1 голос
/ 19 августа 2009

У меня есть объект 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 для хранения пользовательских объектов вместо raw int, но это потребует МНОГО рефакторинга.

Ответы [ 3 ]

3 голосов
/ 19 августа 2009

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

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

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

1 голос
/ 19 августа 2009

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

0 голосов
/ 19 августа 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...