1 静态 object.Equals
public static bool Equals(object objA, object objB) { return objA == objB || (objA != null && objB != null && objA.Equals(objB)); }
说明: 比较引用,比较是否为null 并且 调用类型的Equals方法。
2 静态 object.ReferenceEquals
public static bool ReferenceEquals(object objA, object objB) { return objA == objB; }
说明:比较引用。
3 运算符 ==
- 对于引用类型(class)如果重载了Equals,则调用该Equals,默认调用 object.Equals方法。
- 对于值类型(struct)如果重载了Equals,则调用该Equals,否则,调用ValueType.Equals方法。
public override bool Equals(object obj) { if (obj == null) { return false; } RuntimeType runtimeType = (RuntimeType)base.GetType(); RuntimeType runtimeType2 = (RuntimeType)obj.GetType(); if (runtimeType2 != runtimeType) { return false; } if (ValueType.CanCompareBits(this)) { return ValueType.FastEqualsCheck(this, obj); } FieldInfo[] fields = runtimeType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); for (int i = 0; i < fields.Length; i++) { object obj2 = ((RtFieldInfo)fields[i]).InternalGetValue(this, false); object obj3 = ((RtFieldInfo)fields[i]).InternalGetValue(obj, false); if (obj2 == null) { if (obj3 != null) { return false; } } else if (!obj2.Equals(obj3)) { return false; } } return true; }
说明:
- 1 比较 是否为null
- 2 比较 类型是否一致
- 3 查看能否按位比较
- 3.1 按位进行比较
- 4 通过反射技术,逐个字段(Field)进行比较。
- 4.1 比较字段是否为null
- 4.2 调用字段的Equals
4 实例方法 Equals
public virtual bool Equals(object obj) { return object.InternalEquals(this, obj); }
遗憾,由于方法是外部实现,无法看到具体逻辑。。。
根据很多的测试,与 == 默认的行为一致,除了一个是方法,一个是运算符,但都可以重载。