c# - Linq Lambda 表达式 == 和等于运算符

标签 c# .net lambda

<分区>

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。就个人而言,为了简单起见,我通常将字符串与 == 进行比较。

关于c# - Linq Lambda 表达式 == 和等于运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41479165/

相关文章:

c# - 在列表中存储一对整数

c# - MVC C# 奇怪的 NullReferenceException

c# - 使用 GZipStream 对 MemoryStream 进行编程压缩/解压缩

.NET NetworkStream.EndWrite() 字节写入

kotlin - 如何在Kotlin中替换长链的forEach {}语句?

c# - 编译表达式树的性能

c# - 有没有比在构造函数中作为参数发送更好的方法来设置大量必需的属性?

c# - 是否真的需要只为托管资源实现处置模式

C#:无法将类型为 'System.Int64' 的对象转换为类型 'System.Int32'

c++ - C++11 中的 lambda 表达式是什么?