本文为新手提供了Equals和ReferenceEquals的使用场景,每次打开Object 类,都可以看到
Object 类的这几个方法,其实英语好的同学大概看了就会运用
//
// 摘要:
// Determines whether the specified object instances are considered equal.
// 返回结果:
// true if the objects are considered equal; otherwise, false. If both objA and
// objB are null, the method returns true.
public static bool Equals(Object? objA, Object? objB);
//
// 摘要:
// Determines whether the specified System.Object instances are the same instance.
// 返回结果:
// true if objA is the same instance as objB or if both are null; otherwise, false.
public static bool ReferenceEquals(Object? objA, Object? objB);
//
// 摘要:
// Determines whether the specified object is equal to the current object.
// 返回结果:
// true if the specified object is equal to the current object; otherwise, false.
public virtual bool Equals(Object? obj);
先总结结论,后分析源码
1)public static bool Equals(Object? objA, Object? objB)
这个方法呢,是静态的,值类型和引用类型都可以进行比较,主要比较两个对象是否相同
- 当
objA
和objB
都为null
时,返回true
。 - 当
objA
为null
或objB
为null
时,返回false
。 - 否则,使用
objA.Equals(objB)
方法来比较两个对象的相等性。
public static bool ReferenceEquals(Object? objA, Object? objB)
- 这是一个静态方法,用于比较两个对象的引用是否相等。
- 当
objA
和objB
引用同一个对象时,返回true
。否则,返回false
。 - 注意这个只能比较class ,不能比较 struct 类型,也就是引用类型比较用ReferenceEquals
- 引用类型也可以使用==替换ReferenceEquals
public virtual bool Equals(Object? obj)
:
- 这是一个虚方法,用于比较当前对象与给定对象的相等性。
- 默认实现是使用
ReferenceEquals(this, obj)
来判断两个对象的引用是否相等。 - 通常,需要重写该方法来根据对象的内容进行相等性比较
再进行源码分享:
// System.Runtime.CompilerServices.RuntimeHelpers
//这个是实例方法的比较调用
public static bool Equals(object? objA, object? objB)
{
if (objA == objB)
{
return true;
}
if (objA == null || objB == null)
{
return false;
}
return objA.Equals(objB);
//objA 调用了 下面的 Equals
}
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
ReferenceEquals源码
public static bool ReferenceEquals(object? objA, object? objB)
{
return objA == objB;
}
虚方法 Equals 源码,可以看出 静态方法和 虚方法Equals ,不同是加了引用判断和为空判断
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}