使用.NET中的Hashtable映射指向不可变对象的指针

时间:2009-08-19 16:18:50

标签: .net c++ pointers hashtable immutability

我有一个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 个答案:

答案 0 :(得分:3)

  

我明白这是因为它们是不可改变的。

你理解错了。是的,整数是不可变的。但是地图值没有改变,因为整数是值类型,因此按值传递给地图的Add()方法。换句话说,映射包含传递给Add()方法的值的副本,而不是对传递给方法的变量的引用。

要解决此问题,您需要将整数包装在引用类型(类)中,并为映射提供对该类所需实例的引用。然后确保无论何时更改整数,您都要将它们更改为正确实例的成员。

答案 1 :(得分:1)

您可以更改它以使您的Hashtable只保存对类本身的引用(中断)而不是单个int值。这样,您可以根据实例查找int值。

答案 2 :(得分:0)

如果您使用了Dictionary,并且传递了该成员的地址,那么只要中断对象被固定,它就会起作用。但是,由于Interrupt是一个ref类,因此也会涉及很多工作。老实说,我认为你最好的办法就是现在咬紧牙关,然后进行重构,因为它似乎是正确的事情。