IComparable, IComparable, IComparer, IComparer的区别

注:在.Net framework3.5中已经取消来IComparer接口,原因是该接口比较低效。原因请看下文。

1. IComparable<T>, IComparable接口
IComparable<T>是IComparable的泛型版本。这两个接口都需要实现方法CompareTo。IComparable是实现一般对象的比较接口,
int CompareTo(object obj),它提供来对单个对象进行比较的接口,继承IComparable的类需要自己提供排序比较函数以便对集合对象进行正确序列比较。在使用IComparable接口时需要对非object对象进行装箱和拆箱操作,所以每调用一次CompareTo就需要完成至少2次操作(装箱-拆箱).
    public class MyClass : IComparable
    
{
        
public int CompareTo(Object obj)
        
{
            MyClass cls 
= obj as MyClass;
            
        }

    }
所以如果你比较的对象不是Object对象,建议使用泛型版本的IComparable<T>。

2.IComparer<T>, IComparer接口
IComparer<T>也是IComparer接口的泛型版本,该接口为两对象的比较提供来另一种机制。IComparer接口需要实现Compare方法int Compare(object x, object y),该方法返回三个值1, 0, -1分别表示大于,等于,小于。我们发现IComparable接口和IComparer接口的实现方法所传递的参数是不同的。继承IComparer接口的类可以利用.net framework的公有排序方式如ArrayList.Sort进行排序,因此我们可以不必定义对象的排序操作。IComparer接口存在与IComparable接口同样的效率问题。调用一次Compare操作需要进行4次的装箱拆箱操作,因此在VS2008中已经去掉来从IComparer接口,如果实现相同的功能你可以从IComparer<T>继承。

posted @ 2007-09-12 16:19  moonz-wu  阅读(1295)  评论(0编辑  收藏  举报