良い質問!
しばらく前に同じことを聞いた。
基本的に、これは速度とメモリのトレードオフです。文字列ハッシュコードをキャッシュすることの利点は、おそらく、さらに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.
}
もちろん、これから利益を得るには、StringKey
基本的にプログラム全体でこれらのオブジェクトをどこでも再利用するように非常に注意する必要があります。ほとんどの場合、これは努力する価値がありません。私は、あなたがたまたま例外的なケースである場合に考慮すべきこととしてのみ、このアイデアを含めました。