【问题标题】:How to compare two Hashtables如何比较两个哈希表
【发布时间】:2011-12-21 14:08:52
【问题描述】:

我正在用 C#(使用 XNA)开发一个小型 RTS。

我将每个单元的“goto”位置设置为它们应该去的向量。如果我不比较这两个 Hashtable,一切正常,但是当我这样做时,我会收到“NullReferenceException was unhandled”这个恼人的错误。

这是我收到错误的代码:

if (
    ((float)unit[(int)selectedunits[I+"ID"] + "posX"] != 
     (float)cgoto[(int)selectedunits[I+"ID"] + "X"])
    &&
    ((float)unit[(int)selectedunits[I+"ID"] + "posY"] !=
     (float)cgoto[(int)selectedunits[I+"ID"] + "Y"])
   )

希望这足够具体。

【问题讨论】:

  • unit、selectedunits和cgoto是如何定义的?
  • 请显示NullReferenceException 的堆栈跟踪。这应该突出显示您的空引用的确切位置。
  • 我想selectedunits[I+"ID"] 是空的。请逐步使用 Visual Studio 并在运行时检查该值。
  • 我忘了指定我只在使用“cgoto”哈希表时出现此错误,如果我使用任何其他变量,一切正常。现在可以更好地了解 Stack Trace。
  • 您使用的是哪个版本的 .NET?

标签: c# hashtable


【解决方案1】:

很遗憾,这里没有足够的信息。您在代码行中使用的一种引用类型在执行时为 null。您可以做的是在该行设置一个断点,并在调试模式下执行。当执行流程到达该行时,您可以检查您正在使用的所有引用以查看哪个为空,然后从那里诊断它为什么为空。

  1. http://msdn.microsoft.com/en-us/library/system.nullreferenceexception.aspx
  2. http://msdn.microsoft.com/en-us/library/490f96s2.aspx
  3. http://msdn.microsoft.com/en-us/library/9kkx3h3c.aspx

【讨论】:

    【解决方案2】:

    您提供的哈希表值比较没有问题。铸造和一些一般设计点存在一些问题。我相信您在尝试将 null 转换为 float/int 时遇到了此类异常,为避免此类问题,请使用 Hashtable.ContainsKey() 方法检查给定键是否存在于哈希表中,然后才能访问它的值。不要忘记在转换之前检查 null 值。您也可以考虑使用泛型类型的IDictionary<string, float> (see MSDN),这样所有的值都会被类型化,并且您不需要显式地强制转换,这也会带来一些性能提升,因为不再像您的示例 @987654327 那样对值类型进行装箱@ 存储一个值,object -> float(拆箱)在检索和转换时。

    【讨论】:

    • 谢谢!首先检查 Hashtable 是否包含 Key 可以防止此错误,但它看起来有点奇怪,但我很确定这是我的代码的错。
    • 这是另一个关于哈希表比较的帖子stackoverflow.com/a/8532525/485076
    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多