本质论之对Object中的虚方法进行重写

重写Object的虚方法

在object中,提供了三个虚方法,分别是Equals(object obj)、GetHashCode()、ToSting()。本文以《本质论》为基础,对这三种虚方法重写进行介绍。

在这里插入图片描述

一、重写ToString

public struct Coordinate
        {
            public Coordinate(Longitude longitude, Latitude latitude)
            {
                _Longitude = longitude;
                _Latitude = latitude;
            }
            public Longitude Longitude { get { return _Longitude; } }
            private readonly Longitude _Longitude;
            public Latitude Latitude { get { return _Latitude; } }
            private readonly Latitude _Latitude;
            public override string ToString()
            {
                return string.Format("{0} {1}", Longitude, Latitude);
            }
        }

二、重写GetHashCode

public struct Coordinate
        {
            public Coordinate(Longitude longitude, Latitude latitude)
            {
                _Longitude = longitude;
                _Latitude = latitude;
            }
            public Longitude Longitude { get { return _Longitude; } }
            private readonly Longitude _Longitude;
            public Latitude Latitude { get { return _Latitude; } }
            private readonly Latitude _Latitude;
            public override int GetHashCode()
            {
                int hashCode = Longitude.GetHashCode();
                if (Longitude.GetHashCode() != Longitude.GetHashCode())
                {
                    hashCode ^= Latitude.GetHashCode();//异或
                }
                return hashCode;
            }
        }

三、重写Equals

public struct Coordinate
        {
            public Coordinate(Longitude longitude, Latitude latitude)
            {
                _Longitude = longitude;
                _Latitude = latitude;
            }
            public Longitude Longitude { get { return _Longitude; } }
            private readonly Longitude _Longitude;
            public Latitude Latitude { get { return _Latitude; } }
            private readonly Latitude _Latitude;
            public override bool Equals(object obj)
            {
                //判断是否为空
                if (obj == null)
                {
                    return false;
                }
                //如果类型是密封的,则可以避免使用等效的数据类型
                if (this.GetType() != obj.GetType())
                {
                    return false;
                }
                return Equals((Coordinate)obj);
            }
            public bool Equals(Coordinate obj)
            {
                return ((Longitude.Equals(obj.Longitude))&&(Latitude.Equals(obj.Latitude)));
            }
            /// <summary>
            /// 重写GetHashCode()
            /// </summary>
            /// <returns></returns>
            public override int GetHashCode()
            {
                int hashCode = Longitude.GetHashCode();
                if (Longitude.GetHashCode() != Longitude.GetHashCode())
                {
                    hashCode ^= Latitude.GetHashCode();//异或
                }
                return hashCode;
            }
        }

《本质论》中强调:equals()执行两个对象的==比较。如果一个类没有覆盖hashCode()和equals()方法,则它的equals()方法执行的是引用相等性的比较。若重写Equals而不重写GetHashCode,会出现一个警告。(见书中9.1.3)
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农Giao哥哥

如果觉得不错的话请打赏一波呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值