修复代码分析错误或违反Liskov替换原则/使代码效率低得多

时间:2012-06-28 19:05:45

标签: c# visual-studio-2010 code-analysis

我正在制作PriorityQueue<T>课程,现在我正在使用List<T>作为后备存储。以下是我得到的错误:

具有正确的后缀/没有不正确的后缀

不要公开List<T>

对于-Queue后缀,我需要继承Queue<T>,但是要对Queue<T>进行排序,我需要清空队列,排序,然后重新填充队列。另外,如果我继承自Queue<T>,我会违反LSP,因为优先级队列不是FIFO集合。

对于我正在制作的其中一种PriorityQueues,使用IComparer<T>来比较元素,但IComparer<T>仅支持数组和List<T>

我确实看到this question,但它与我的问题没有完全相关。

所以这是我的问题: 我应该抑制这些代码分析警告吗? 我应该继承Queue<T>并重写我的类来解决它,即使效率较低吗? 如果没有,我还应该换掉List<T>换取其他内容吗?

编辑: 我不知道这是否会有所不同,但以下是我对每个课程的设置:

  • PriorityQueue<T> - 抽象基类(Sort()是抽象的)

  • PriorityQueue<T, TComparer> - 使用比较器的子类 排序

  • ReflectionPriorityQueue<T> - 使用反射的子类 排序,细节对这个问题不重要。

1 个答案:

答案 0 :(得分:5)

这些错误与使用List<T>无关 - 它们与公共API有关。

  

具有正确的后缀/没有不正确的后缀

这个是值得商榷的 - 就个人而言,我会停用此警告,因为PriorityQueue<T>在我看来应该使用名称PriorityQueue<T>

  

不要公开列表

这只是意味着您无法公开List<T>公开为List<T>。如果您要封装列表,则永远不会出现。只要您保留列表私有,此警告就会消失。

  

我应该从Queue继承并重写我的类来解决它,即使效率较低吗?如果没有,我还应该换掉List吗?

我怀疑问题是你试图将List<T>子类化,这是一个坏主意。将其封装为私有成员,并实现相应的接口。