代码之家  ›  专栏  ›  技术社区  ›  Eric

将指针映射到.NET中具有哈希表的不可变对象

  •  1
  • Eric  · 技术社区  · 15 年前

    我有一个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。

    沿着这条路往前走,我查询了我的哈希表,但是值没有改变。我理解这是因为它们是不变的。是否可以指定哈希表来保存指向类字段的指针,而不是存储引用的值?

    我知道我可以修改类中断来保存自定义对象,而不是原始int,但是它会调用很多重构。

    3 回复  |  直到 15 年前
        1
  •  3
  •   Joel Coehoorn    15 年前

    我理解这是因为它们是不变的。

    你理解错了。是的,整数是不可变的。但是映射值没有改变,因为整数是值类型,所以被一个值传递给映射的add()方法。换句话说,地图上有一个 复制 传递给add()方法的值,而不是对 变量 传递到方法。

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

        2
  •  1
  •   Reed Copsey    15 年前

    您可以将其更改为让哈希表只保存对类本身的引用(中断),而不是单个int值。这样,就可以根据实例查找int值。

        3
  •  0
  •   Harper Shelby damiankolasa    15 年前

    如果您使用一个字典,并传递成员的地址,它将工作……只要中断对象被固定。然而,由于中断是一个引用类,这也需要大量的工作。我真的认为你最好现在就咬紧牙关,做你的重构,因为这似乎是正确的事情。