【发布时间】:2017-01-05 07:11:57
【问题描述】:
var list = new List<string>();
var word = "some word";
list.Add("some word");
list.Add("some sentence");
list.Add(word);
我知道 Equals 比较存储在引用中的值,而 "==" 比较两个引用是否指向同一个对象。但即使在 lambda 表达式中也一样吗?
list.RemoveAll(x => x.Equals("some word"));
list.RemoveAll(x => x == "some word");
这些语句产生相同的结果吗?
【问题讨论】:
-
LINQ 不会改变
==运算符或Equals方法的工作方式。此外,==在 C# 中不一定像在 Java 中那样“比较引用” - 它是创建了任何明智的运算符重载。一个很容易咬人的区别是null.Equals(x)会抛出异常,而null == x不会。 -
""==" 比较引用本身" - 这取决于
x的类型。如果x是一个字符串,它将调用string中的==运算符,它执行一个值比较。如果x的类型是object(即编译时类型),那么它将进行引用比较。 -
请提供minimal reproducible example,以便我们真正推断
==的含义。理想情况下,也请告诉我们这个问题的动机......从根本上说,lambda 表达式中的代码行为正常,假设它被转换为委托。 (如果它被转换为表达式树,那么含义应该是相同的,但它可能会被任何消耗树的东西解释不同。) -
.Equals不会“比较存储在引用中的值”,它会做任何T.Equals(T)的程序员决定它应该做的事情,并且在字符串的上下文中它会做一个字符串 value 比较,不是引用比较,虽然肯定两个相等的引用也意味着相等的值,但是即使引用不同,但值相同,字符串上的.Equals将返回true。 -
@Lasse V.Karlsen 是的,我同意这一点。我想单独了解 String 对象的情况。