我从来没有用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>
这会崩溃的?如果是,它有多普遍?
编辑:在这种情况下,我真的不想要第二个版本的开销的原因是数据结构是持久的。它被实现为一棵树,其中节点没有父/根引用。所以它不是每个队列对比较器的一个引用,而是每个节点对比较器的一个引用!我最初的设计只是使用IComparable<T>
并建议编写一个包装结构来进行自定义比较。