我们知道在比较字符串是否相等时,用“==”运算符与用equal方法会有等效的结果,我们也知道对象相等比较使用“==”运算符是看引用是否相等(同ReferenceEquals), 而Equals方法在字符串中具有按值进行比较的重写,那么字符串比较 “Equals”与“==”等效的原因是什么呢?这点可以根据源码Object是如何实现ReferenceEquals、Equals方法,以及String类如何重写Equals方法的,再以及官方在查询表达式的join子句中对“等于运算符”的描述可知其实现“字符串比较‘Equals方法’与‘==’等效”的原理。
一、Object的ReferenceEquals、Equals方法
二、String的Equals方法重写
三、Null的字符串或对象的 “==”、Equals、ReferenceEquals 相等比较:
四、官方在查询表达式的join子句中对“等于运算符”的描述如下:
join
子句执行同等联接。 换句话说,匹配只能基于两个键的相等性。 不支持其他类型的比较,例如“大于”或“不相等”。 为了明确所有联接都是等联接,join
子句使用 equals
关键字而不是 ==
运算符。 关键字 equals
只能在 join
条款中使用,并且它在某些重要方面与 ==
运算符不同。 比较字符串时, equals
具有按值进行比较的重载,运算符 ==
使用引用相等性。 当比较双方具有相同的字符串变量时,equals
和 ==
都会达到相同的结果:true。 这是因为,当程序声明两个或更多等效的字符串变量时,编译器会将所有这些变量存储在同一位置。 这称为“集中”。 另一个重要区别是 NULL 比较:null equals null
使用 equals
运算符的计算结果为 false,而不使用计算结果为 true 的 ==
运算符。 最后,范围行为不同:对于 equals
,左键使用外部源序列,而右键使用内部源。 外部源仅在左侧 equals
的作用域中,并且内部源序列仅在右侧的作用域内。