c#的Equals

c#的 Equals有很多方式。

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);
		}

遗憾,由于方法是外部实现,无法看到具体逻辑。。。
根据很多的测试,与 == 默认的行为一致,除了一个是方法,一个是运算符,但都可以重载。

猜你喜欢

转载自superherosk123.iteye.com/blog/2363245