相等性分为:A引用相等(ReferenceEquals),B值相等(Equals)
B值相等还分为:A静态Equals(Object objA, Object objB),B实例Equals(Object obj)
引用相等意味着要比较的不是两个对象,而是两个对象引用,
值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。
如果两个对象具有引用相等性,则它们也具有值相等性,
但是值相等性不能保证引用相等性
静态版的Equals依赖于实例版的Equals
如果重载 == 相当于把系统默认的引用相等转换成值相等
当类型重载 operator == 时, 它也必须重写 实例版的Equals 方法以提供同样的功能。
重载运算符 == 的任何类型还应重载运算符 !=。
默认情况下,通过判断两个引用是否指示同一对象来测试引用是否相等,
因此引用类型不需要实现运算符 == 就能获得此功能。
注意:
运算符 == 的重载中的常见错误是使用 (a == b)、(a == null) 或 (b == null) 来检查引用相等性。
这会导致调用重载的运算符 ==,从而导致无限循环。
应使用 ReferenceEquals 或将类型强制转换为 Object 来避免无限循环。
值类型继承ValueType,将重写实例版的Equals
建议:重写 Equals 的任何类同时也重写 System.Object.GetHashCode。
由于在.Net中不允许重写静态方法
所ReferenceEquals和静态Equals是不能重写的
对ReferenceEquals来讲,始终是自然引用,也就是来自于系统默认的对象引用比较
对静Equals来讲,同样是自然引用,但他调用的是来自对象本身的实例,相当于被重写了.
引自 http://topic.csdn.net/u/20090908/00/e64b8f60-0c91-44c0-a3dc-4387b8dfaa21.html