zoukankan      html  css  js  c++  java
  • 由object不能比较引发的问题

    这是一个小问题,请看下面的代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Sample
    {
        class Program
        {
            static void Main(string[] args)
            {
                object a = 5;
                object b = 6;
    
                //直接利用object进行比较
                Console.WriteLine(a > b);
            }
        }
    }
     
    我们假设有两个变量,其实它们是int,但程序用object来接收它们。然后我们需要对它们进行比较
    很抱歉,上面代码不能运行,甚至它都不能编译
    image 
    为什么会报告这个错误呢?这是因为object这个基础类型并没有实现类似于IComparable之类的接口,也就是说它们的值本身是无法比较的。
    那么这又是为什么呢?因为Object其实是引用类型,同时又因为任何数据都可以用Object表示,所以其他它不可能知道到底怎么比较不同object直接的值的
    例如,你可能会那一个int的数值(5)去跟一个Employee的数值(例如某个实例)比较,大家想想它怎么可能知道应该怎么比较呢?
    ok,那么如何解决我们上面的问题呢,假设我们希望两个object可以比较,有何方法呢?
    其实是有可能实现的,我们再来看下面的代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Sample
    {
        class Program
        {
            static void Main(string[] args)
            {
                object a = 5;
                object b = 6;
    
                //直接利用object进行比较
                Console.WriteLine(a.GetHashCode() > b.GetHashCode());
                Console.Read();
            }
        }
    }
    

    这样我们就实现了比较了,我们分别对两个object去获取HashCode,这个方法返回的是int,既然是int当然就可以比较了。

    那么,也就是说其实任何类型都可以通过实现GetHashCode方法,来提供这个支持

        class Employee {
            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
        }

    那么,如果不重写这个方法,默认的HashCode是多少呢?猜猜看吧

    答案是:这是一个随机的Int数值。

     

    最后,我们可以考虑为Object实现一个扩展方法,让它可以”比较”

        public static class ObjectExtensions {
            public static int CompareTo(this object obj1, object obj2) {
                return obj1.GetHashCode().CompareTo(obj2.GetHashCode());
            }
        }

    然后就可以使用下面这样的方式去比较

    Console.WriteLine(a.CompareTo(b));

     

     
  • 相关阅读:
    用JavaScript玩转计算机图形学(二)基本光源
    两条像面试用的编程问题,和我的囧事
    混合语言的游戏开发系统架构
    为你详解Linux安装GCC方法
    Windows Phone 7常用资源大集合
    html5之Web Workers示例
    MFC/Win32中使用GDI+
    linux yum命令详解
    Linux development tools
    HTML5之Canvas标签简要学习
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/1699450.html
Copyright © 2011-2022 走看看