系统提供了许多泛型类和泛型接口,List和Dictionary是常用的泛型类。IComparable是最常用的泛型接口。泛型接口具有一般接口的共同特点,即在接口中可以包含字段,属性,方法和索引器,但都不能实现。
IComparable和IComparer接口区别如下: ◆IComparable在要比较的对象的类中实现,可以比较该对象和另一个对象; ◆IComparer在一个单独的类中实现,可以比较任意两个对象。
IComparable接口规定了一个没有实现的方法CompareTo(Object obj),语法如下: public interface IComparable { int CompareTo(Object ojb); }
此接口的方法CompareTo用于比较对象大小,如果一个类实现了这个接口中的该方法,说明这个类的对象是可以比较大小的。 int CompareTo(Object obj)方法返回一个整型值,其含义下:
如果当前对象小于obj,则返回值小于0。 如果当前对象小于obj,则返回值大于0。 如果当前对象小于obj,则返回值等于0。 IComparable接口接受的参数类型为Object,因此需要对CompareTo()函数的参数进行运行时类型校验。每一次执行比较时,都要重新解析参数的类型。
using System; using System.Collections.Generic; public class Student: IComparable { private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { age = value; } } public Student(string sname, int sage) { this.name = sname; this.age = sage; } //实现接口中的方法 public int CompareTo(object obj) { //将参数转化为Student对象 Student other = obj as Student; //比较大小,返回结果 return this.age.CompareTo(other.age); } }
class Progarm { static void Main() { Student stu1 = new Student("张三", 10); Student stu2= new Student("李四", 20); Student stu3 = new Student("王五", 30); //对象之间进行比较 if (stu1.CompareTo(stu2) > 0) Console.WriteLine("{0}的年龄大于{1}", stu1.Name, stu2.Name); else Console.WriteLine("{0}的年龄小于{1}", stu1.Name, stu2.Name); } }
注意:参数obj必须与实现该接口的类有相同的类型,否则会引发异常。
Student other = obj as Student; 使用as关键字将obj转换为实现接口的Student类的对象。 说明:as属于运算符,用于在兼容的引用类型之间执行类型转换,类似于强制转换,只是强制转换失败时会引发异常,而as运算符将返回空值,不会引发异常。
泛型接口IComparable就是接口Icomparable的泛型版本,和前面的泛型一样,此泛型接口对类型有严格的约束,不需要类型转换。
IComparable泛型接口仅包含一个方法,语法如下:
public interface Icomparable { int CompareTo(T t) }
其中,“”和List中的T有相同的含义,代表任意类型,CompareTo方法中的参数t代表该数据类型的对象。
把上面的代码改写一下: public class Student: IComparable 换成 public class Student: IComparable 同时实现接口的代码改为: //实现接口中的方法 public int CompareTo(Student other) { //比较大小,返回结果 return this.age.CompareTo(other.age); }
其他代码不需要修改,运行结果和上面代码相同。