重写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)