在编写比较器类时,从4.0版开始,C#中的最佳实践是什么:
一个。我们应该继承Comparer抽象类吗?或
湾我们应该实现IComparer接口。
有什么优点和缺点?
答案 0 :(得分:12)
我建议您扩展Comparer<T>
类而不是实现IComparer<T>
接口,Microsoft也是如此(请参阅下面的第一个参考资料)。
现在,如果您希望对象本身(无论T是什么)能够与自身进行比较,它可以实现IComparable
接口(请参阅下面的第二个参考)。
来自:http://msdn.microsoft.com/en-us/library/8ehhxeaf(v=vs.110).aspx(IComparer<T>
)
我们建议您从
Comparer<T>
类派生而不是实现IComparer接口,因为Comparer<T>
类提供IComparer.Compare
方法和Default
的显式接口实现。获取对象的默认比较器的属性。
来自:http://msdn.microsoft.com/en-us/library/cfttsh47(v=vs.110).aspx(Comparer<T>
)
从此类派生,提供
IComparer<T>
接口的自定义实现,以用于集合类,例如SortedList<TKey, TValue>
和SortedDictionary<TKey, TValue>
泛型类。 从Comparer类派生和实现System.IComparable
接口之间的区别如下:
- 要指定默认情况下应如何比较两个对象,请在类中实现
System.IComparable
接口。这可确保排序操作将使用您提供的默认比较代码。- 要定义要使用的比较器而不是默认比较器,请从Comparer类派生。然后,您可以在将比较器作为参数的排序操作中使用此比较器。
答案 1 :(得分:1)
我们建议您从Comparer类派生而不是实现IComparer接口,因为Comparer类提供IComparer.Compare方法的显式接口实现和获取对象的默认比较器的Default属性。