C# 空实例的哈希表.Net异常

C# 空实例的哈希表.Net异常,c#,.net-2.0,C#,.net 2.0,我正在使用.Net 2.0,遇到了一个奇怪的错误: 我有一个哈希表,使用字符串作为键,使用一个类(名为Market)作为值。该类包含4个整数和1个字节。其中一个整数表示我需要递增的计数器 我在哈希表中只有一个元素。它的键是“Tomo” 我这样做: string strM = "Tomo" MarketPlace mkt = (MarketPlace)mHash[strM]; mkt.nCter++; 在最后一行中,我得到一个空引用异常,即使使用调试器,我可以看到哈希表包含该实例。此代码一周前运

我正在使用.Net 2.0,遇到了一个奇怪的错误:

我有一个哈希表,使用字符串作为键,使用一个类(名为Market)作为值。该类包含4个整数和1个字节。其中一个整数表示我需要递增的计数器

我在哈希表中只有一个元素。它的键是
“Tomo”

我这样做:

string strM = "Tomo"
MarketPlace mkt = (MarketPlace)mHash[strM];
mkt.nCter++;

在最后一行中,我得到一个空引用异常,即使使用调试器,我可以看到哈希表包含该实例。此代码一周前运行正常。

找到执行以下操作之一的位置:

mHash[strM] = mkt;
mHash.Add(strM, mkt);
在该位置,
mkt
null

编辑:这是基于您声明已验证
哈希表
包含密钥的事实。如果实际上
哈希表
不包含该键,则以下情况适用:

如果找不到指定的键,尝试获取它将返回
null


因为您使用的是.NET2.0,所以我建议您使用
字典
,而不是哈希表。它将提供类型安全性,并可能帮助您了解在本例中出现问题的原因。

您确定您不仅仅是查看哈希表中的键,其中的值为null吗

例如,这项工作:

mHash["Tomo"] = null;
Market value = (Market)mHash["Tomo"];
value.nCounter++; // NullReferenceException

可能是您向后添加了实例

mHash.Add(instance, "Tomo")
而不是

mHash.Add("Tomo", instance)

因此,当您在调试器中时,它可能看起来好像已列出,但键实际上是实例,“Tomo”是对象值。

您使用的是.NET 2.0。为什么要使用哈希表?使用
词典
为什么?在.NET 2.0上不允许使用哈希表?它用于向后兼容.NET 1.1/1.0。你真的不应该使用它。在.NET 2.0上使用枚举器是安全的吗?我确信它包含一个类的实例。你的一个假设一定是错误的,否则你不会得到这个错误:)它包含一个不是null的键,甚至是在使用该类实例之前的一个函数。再次检查-不是null的键,值
mkt
为空。此外,即使在
Market mkt=(Market)mHash[strM]行上设置了断点,也会抛出
NullReferenceException
?这是拼图中的一个关键信息。对类型的转换无论如何都会完成,那么这个解决方案的好处是什么呢?你能解释更多吗?你避免拳击,这可能会导致(潜在的)一些你所看到的问题。您还可以获得类型安全性—因此您可以确保添加到集合中的代码以及接收方都以相同的方式进行操作。在您的例子中,您可能正在添加空引用、使用错误的键添加,或者使用错误的键检索。具有类型安全性有助于编译器检查此过程中最常见的错误。另一个好处是,使用泛型可以获得更好的性能,因为可以避免装箱。这样可以使代码更可读、更易于调试。(而且,运行库已经预先知道可以将对象强制转换为所需的类型,从而避免检查)在这种情况下,没有装箱操作。值的市场类(ref-type)和键的字符串(ref-type)。@Thorarin:这是真的-没有带字符串或“Market”的装箱,除非“Market”是一个结构而不是类。