您现在的位置是:首页 > 文章详情

C# 中对象比较的几种方式

会飞的猪2018-11-03103人围观
简介白码驿站是一个面向开发者的知识共享社区,专注于为开发者打造一个纯净的技术交流社区(源码下载,免费在线图片压缩,jquery插件,插件下载,JS/CSS在线压缩。)-白码驿站

        我们都知道, 数值比较可以使用"><="等常用的比较运算符,但是对象就不实用了,因为我们无法确定对象需要按照什么条件来进行比较。(例如:我们有两个学生对象,都有年龄(age)和身高(height)属性,如果要比较这两个对象, 使用比较运算符显示是不合适的。)下面就来看看如何对对象进行比较。

一:使用运算符重载


        通过运算符重载,可以对我们设计的类进行标准的运算符,例如 +,>等。这称为重载,因为在使用特定的参数类型时,我们为这些运算符提供了自己的实现代码,其方式与重载方法相同,也是为同名方法提供不同的参数。

        我们先看一下运算符重载的基本语法。要重载运算符,可给类添加运算符类型成员(它们必须是static)。一些运算符有多种用途(如 ‘-’运算符就有一元和二元两种功能),因此我们指定了要处理多少个操作数,以及这些操作数的类型。

例如我们有个学生类, 有身高和年龄两个字段

                                        
    public class Student
    {
        public string Height;
        public int Age;
    }
                                

现在有两个对象, 需要按照年龄来进行比较, 下面的代码是生成失败的。

                                        
            Student stu1 = new Student();
            stu1.Age = 20;
            stu1.Height = "182";

            Student stu2 = new Student();
            stu2.Age = 23;
            stu2.Height = "175";
            bool stu = stu1 > stu2
                                

这个时候我们就可以使用运算符重载了,可使用下述代码:

                                        
    public class Student
    {
        public string Height;
        public int Age;

        /// <summary>
        /// 运算符重载
        /// </summary>
        /// <param name="s1"></param>
        /// <param name="s2"></param>
        /// <returns></returns>
        public static bool operator >=(Student s1, Student s2)
        {
            return s1.Age > s2.Age;
        }

        public static bool operator <=(Student s1, Student s2)
        {
            return s1.Age > s2.Age;
        }
    }
                                

可以看出,运算符重载看起来与标准静态方法声明类似,但他们使用关键字 operator 和运算符本身,而不是一个方法名。

重载运算符清单


· 一元运算符:+,-,!,~,++,--,true,false

· 二元运算符:+,-,*,/,%,&,|,^,<<,>>

· 比较运算符:==,!=,<,>,<=,>=


二:IComparable 和IComparer


IComparableIComparer接口是.NET Framework中比较对象的标准方式。这两个接口之间的差别如下:

· IComparable在要比较的对象的类中实现,可以比较该对象和另-一个对象。

· IComparer在一个 单独的类中实现,可以比较任意两个对象。

        一般使用IComparable给出类的默认比较代码,使用其他类给出非默认的比较代码。IComparable提供了一个方法CompareTo(),这个方法接受一个对象。例如,在实现该方法时,使其可以接受一个 Person对象,以便确定这个人比当前的人更年老还是更年轻。实际上,这个方法返回一个int,所以也可以确定第一个人与当前的人的年龄差:

                                        
            if (stu1.CompareTo(stu2)==0)
            {
                Console.WriteLine("stu1年龄与stu2一样大");
            }
            else if (stu1.CompareTo(stu2) > 0)
            {
                Console.WriteLine("stu1年龄比stu2大");
            }
            else
            {
                Console.WriteLine("stu1年龄比stu2小");
            }
                                

IComparer 也提供了一个方法Compare()。这个方法接受两个对象,返回一个整型结果,这与CompareTo()相同。对于支持IComparer的对象,可以使用下面的代码:

                                        
            Student stu = new Student();
            if (stu.Compare(stu1,stu2)==0)
            {
                Console.WriteLine("stu1年龄与stu2一样大");
            }
            else if (stu.Compare(stu1, stu2) > 0)
            {
                Console.WriteLine("stu1年龄比stu2大");
            }
            else
            {
                Console.WriteLine("stu1年龄比stu2小");
            }
                                

这两种情况下,提供给方法的参数是System.Object 类型。这意味着可以比较一个对象与其他任意类型的另一个对象。所以,再返回结果之前,通常需要进行某种类型比较,如果使用了错误类型,还会抛出异常。

文章评论

Top

目录

昵称:会飞的猪

职业:.net程序员

邮箱:753109098@qq.com

分类标签

本栏推荐