IComparer<T>
デフォルトのコンストラクターを使用してステートフルを作成したことはありません。Reflector で確認したすべての標準ライブラリの実装もステートレスです。したがって、次のように自由にキャッシュできると想定したいと思いIComparer<T>
ます。
PriorityQueue<TPriority, TComparer> where TComparer : IComparer<TPriority>, new()
{
private static TComparer _comparer = new TComparer();
public PriorityQueue() {...}
...
}
それ以外の
PriorityQueue<TPriority>
{
private IComparer<TPriority> _comparer;
public PriorityQueue(IComparer<TPriority> comparer) {
_comparer = comparer;
...
}
...
}
では、ここで質問ですIComparer<T>
。これが壊れるようなものを書いたり見たりしたことがありますか? はいの場合、それはどのくらい一般的ですか?
編集:この場合、2番目のバージョンのオーバーヘッドが本当に欲しくない理由は、データ構造が永続的であるためです。ノードが親/ルート参照を持たないツリーとして実装されます。したがって、キューごとに比較子への 1 つの参照ではなく、ノードごとに比較子への 1 つの参照になります! 私の当初の設計はIComparable<T>
、カスタム比較用のラッパー構造体を使用して作成することをお勧めするだけでした。