好问题!
I asked the same thing a while back.
基本上,这是一个速度/内存的权衡。缓存字符串哈希代码的好处可以被每个单独的字符串对象的开销所抵消,这需要分配另外的32位内存。当您考虑程序中可能存在的大量字符串与您关心的哈希码的数量(大概是因为您将它们用作键)时,这是有意义的。
后一个数字在某些程序中可能很大,但也可能很小。在很多情况下甚至可能为零。
如果性能是一个极度关注你在某些情况下,你可能考虑写自己的包装,做缓存的散列码:的
public class StringKey
{
string value;
int hashCode;
public StringKey(string value)
{
this.value = value;
this.hashCode = value.GetHashCode();
}
public override int GetHashCode()
{
return this.hashCode;
}
public override string ToString()
{
return this.value;
}
// Plus all the other stuff you'd want to include here,
// e.g., Equals, CompareTo, etc.
}
要获得任何好处了这一点,当然,你仍然需要非常小心地在整个程序中重用这些对象。在绝大多数情况下,这是不值得的;如果你碰巧是一个特殊情况,我只是将这个想法包括在内。
除了一点复杂性和4个字节的内存,什么也没有。 – CodesInChaos 2012-07-18 20:44:04
我感觉到这个问题太好了,至今仍未得到解决。不幸的是,当我写它时,它从来没有出现过......我只是投票结束了这个。 – Humberto 2012-07-18 20:47:18