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");
这些语句产生相同的结果吗?
I know Equals compare the value stored in the reference while "==" compares whether two references point to the same object.
不,这只是引用类型的 default ==
运算符的行为。当 ==
的两边都有 string
的编译时类型时,bool operator==(string, string)
重载声明在使用 string
类,当调用的目标不为 null 时,您会得到与 Equals
相同的结果。
该行为在常规代码中与在 lambda 表达式中完全相同。用 lambda 表达式编写的代码应该与 不是 用 lambda 表达式编写的代码完全相同......尽管如果 lambda 表达式转换为表达式树,编译器只会将代码作为数据发出,所以它取决于消耗表达式树的任何东西来用它做正确的事情。
是的,代码应该可以正常工作 - 使用 Equals
和使用 ==
之间的唯一区别是,如果您的列表包含任何 null
元素,x.Equals(...)
调用将抛出一个 NullReferenceException
。就个人而言,为了简单起见,我通常将字符串与 ==
进行比较。