字符串比较 “Equals方法”与“==”等效的原因(一个老生常谈、你可能知其然不知其所以然的问题)

我们知道在比较字符串是否相等时,用“==”运算符与用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 的作用域中,并且内部源序列仅在右侧的作用域内。

(https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/join-clause#the-equals-operator)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值