【问题标题】:Lambda Expression: == vs. .Equals()Lambda 表达式:== 与 .Equals()
【发布时间】:2010-02-16 14:35:40
【问题描述】:

这是一个纯粹的学术问题,但是在 lambda 表达式中使用 == 和 .Equals 和首选哪个有什么区别?

代码示例:

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

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

【问题讨论】:

  • 为什么“== vs. Equals in Lambda 表达式”不同于“== vs. Equals in general”?
  • @Heinzi,对于作为表达式树的 lambda(即,不是 x => {} 的语法,它是匿名委托的快捷方式),可能会有所不同,具体取决于谁(哪个提供者)评估表达式树。
  • @FrustratedWithFormsDesigner - CategoryId 是一个整数,我也会用这个信息更新问题。

标签: c# lambda


【解决方案1】:

对于引用类型,== 旨在传达引用相等性 — 两个 变量 是否引用 same 对象实例。
.Equals() 旨在传达值相等——两个变量引用的两个可能不同的对象实例是否具有相同的值,对于通过重载方法提供的“相同”的某些定义。

对于值类型,这两个含义是模糊的。

【讨论】:

  • 其实这更多的区别是Java,不能重载operator==来显示值相等。
  • 嗯,string 类型呢?它是一个引用类型,但 == 寻找值相等,而不是引用相等。
  • System.String 是一个 RTINO(仅在名称中引用类型)。出于优化原因,它被实现为引用类型。它的设计目的是让消费者以各种方式将其视为值类型。
  • @Lucero:任何引用类型都可能重载==,但如果没有重载,Joel 的答案是正确的; == 对于引用类型的默认行为是引用相等。
  • @Michael... 嗯.. 这将使它成为 RTIIO(仅在实现中的引用类型)
【解决方案2】:

它们可以单独重载,因此它们可以提供不同的答案。请参阅http://msdn.microsoft.com/en-us/library/ms173147(VS.80).aspx,其中讨论了如何重载每个。通常它们是相同的,但不能保证这一点。所以这取决于 lambda 对象是什么类型。

【讨论】:

    【解决方案3】:

    Lambda 在这里无关紧要...

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-15
        • 1970-01-01
        • 2020-07-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多