Lambda表达式:==与.Equals()的区别

17

这只是一个纯学术问题,但在lambda表达式中使用“==”和“.Equals”的区别是什么?哪个更受欢迎?

代码示例:

int categoryId = -1;
listOfCategories.FindAll(o => o.CategoryId == categoryId);

int categoryId = -1; 
listOfCategories.FindAll(o => o.CategoryId.Equals(categoryId));

13
在Lambda表达式中,“==”和“Equals”的区别为什么会与普遍情况下的“==”和“Equals”的区别不同? - Heinzi
7
对于表达式树形式的Lambda函数(即不是语法x => {}的匿名委托的快捷方式),根据评估表达式树的人(即哪个提供程序)可能会有所不同。 - Lucero
@FrustratedWithFormsDesigner - CategoryId 是一个整数,我会在问题中更新这个信息。 - Robert W
5个回答

9

对于引用类型,== 的作用是判断两个变量是否指向同一对象实例。
.Equals() 的作用是判断两个不同的对象实例是否具有相同的值,你可以通过重载该方法来定义“相同”的含义。

对于值类型,这两种含义有些模糊。


3
实际上,这更多是Java的区别,其中运算符“==”无法被重载以显示值相等。 - James Curran
4
“string”类型呢?它是一个引用类型,但“==”运算符寻找的是值相等性,而不是引用相等性。 - Lucero
3
System.String是一个RTINO(仅在名称中引用类型)。由于优化原因,它被实现为引用类型。它被设计成消费者可以像值类型一样对待。 - Michael Meadows
@Lucero:任何引用类型都可以重载==,但如果没有重载,Joel的答案是正确的;对于引用类型来说,==的默认行为是引用相等。 - Aaronaught
@Michael... 嗯... 这会使它成为一个 RTIIO(仅实现引用类型)。 - James Curran

2

1

这里 Lambda 是无关紧要的...

对于值对象,== 和 equals 是相同的。 对于引用对象,如果两个对象是同一个对象(指向同一实例),== 将为 true,而期望 equals 比较对象的内容。这个 链接 以另一种方式解释了它。


0

这取决于对象的定义。如果类中没有定义operator==,则会使用Object类中的operator==,该operator==在最终调用Equals()之前检查Object.ReferenceEquals。

这显示了一个重要的区别: 如果你说 A.Equals(B),那么A必须是非空的。如果你说A == B,则A可以为null。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接