尝试在哈希表中查找值时可能出现意外的引用比较问题
Possible unintended reference comparison issue when trying to find a value in hashtable
请问我做错了什么:
Hashtable dd = new Hashtable () ;
for (int i = 0; i < 1000000; i++)
{
dd.Add(i, i.ToString());
}
var key = dd.Values.OfType<string>().FirstOrDefault(s => dd[s] == "10000");
它一直显示以下错误:
possible unintended reference comparison to get a value
comparison cast the left hand to string
Hashtable
不是泛型类型,因此 dd[s]
的 return 是 object
。当您使用 ==
并且任何一方在编译时都是 object
时,您得到的是引用比较,而不是值比较。这是因为所有运算符都是 static
并受编译器约束,而 object
中的 ==
执行引用比较。
要解决此问题,请使用虚拟 .Equals
,它会在 运行-time
查找正确的方法
dd[s].Equals("10000")
或object.Equals
,检查null
然后调用虚拟.Equals
object.Equals(dd[s], "1000000")
请注意,这只是一个警告,不是一个错误,您的代码将编译,但可能会产生意外结果。
但是,如果您可以使用更新的 class,那么使用 Hashtable
、Dictionary<TKey, TValue>
的通用形式可能会更加强大
编辑:最后一点,即使在应用 .Equals
之后,您的代码也可能无法正常工作,因为使用 dd[s]
您正在创建密钥查找,而是传递一个值。
Hashtable
是一个旧结构,您应该避免使用它。它不使用 generics,所以你从中得到的任何对象都是 object
.
当您使用 ==
运算符比较 dd[s]
和 "10000"
时,它将使用引用比较(例如,两个 object
是否引用同一点在内存中),而你 可能 打算 any 字符串匹配 "10000"
结果相等。编译器警告你这可能不会给你你想要的东西。
请问我做错了什么:
Hashtable dd = new Hashtable () ;
for (int i = 0; i < 1000000; i++)
{
dd.Add(i, i.ToString());
}
var key = dd.Values.OfType<string>().FirstOrDefault(s => dd[s] == "10000");
它一直显示以下错误:
possible unintended reference comparison to get a value
comparison cast the left hand to string
Hashtable
不是泛型类型,因此 dd[s]
的 return 是 object
。当您使用 ==
并且任何一方在编译时都是 object
时,您得到的是引用比较,而不是值比较。这是因为所有运算符都是 static
并受编译器约束,而 object
中的 ==
执行引用比较。
要解决此问题,请使用虚拟 .Equals
,它会在 运行-time
dd[s].Equals("10000")
或object.Equals
,检查null
然后调用虚拟.Equals
object.Equals(dd[s], "1000000")
请注意,这只是一个警告,不是一个错误,您的代码将编译,但可能会产生意外结果。
但是,如果您可以使用更新的 class,那么使用 Hashtable
、Dictionary<TKey, TValue>
编辑:最后一点,即使在应用 .Equals
之后,您的代码也可能无法正常工作,因为使用 dd[s]
您正在创建密钥查找,而是传递一个值。
Hashtable
是一个旧结构,您应该避免使用它。它不使用 generics,所以你从中得到的任何对象都是 object
.
当您使用 ==
运算符比较 dd[s]
和 "10000"
时,它将使用引用比较(例如,两个 object
是否引用同一点在内存中),而你 可能 打算 any 字符串匹配 "10000"
结果相等。编译器警告你这可能不会给你你想要的东西。