温故知新 C# Equals ReferenceEquals ==
System.Object类中的Equals和ReferenceEquals方法
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
public static bool ReferenceEquals(object objA, object objB)
{
return (objA == objB);
}
{
return RuntimeHelpers.Equals(this, obj);
}
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
public static bool ReferenceEquals(object objA, object objB)
{
return (objA == objB);
}
其中Equals有两个重载,一个是虚方法,一个是静态方法
静态的Equals内部做判定处理,调用虚方法Equals.
(1)对于引用类型
这三种比较方式都是对引用进行比较
当RefrenceEquals(null,null)两个参数都为null时,返回的是True
(2)对于值类型
Equals:用于对实例数据进行对比(System.ValueType重载了Object.Equals,实现对实例数据进行判等)
==:如果再没有重载的情况下,是按位进行对比的
ReferenceEquals:返回的都是false
所以,当是值类型时,ReferenceEquals返回的都是false,而Equal和==根据值类型的类型和值进行比较,