【问题标题】:!(ReferenceEquals()) vs != in Entity Framework 4!(ReferenceEquals()) 与 != 在实体框架 4 中
【发布时间】:2010-06-14 04:55:06
【问题描述】:

除非一个类专门覆盖为 Object 定义的行为,ReferenceEquals and == do the same thing... 比较引用。

在属性设置器中,我常用的模式

private MyType myProperty;

public MyType MyProperty
{
    set
    {
        if (myProperty != value)
        {
            myProperty = value;
            // Do stuff like NotifyPropertyChanged
        }
    }
}

但是,在 Entity Framework 生成的代码中,if 语句被替换为

    if (!ReferenceEquals(myProperty, value))

使用 ReferenceEquals 更加明确(因为我猜不是所有 C# 程序员都知道 == 如果不被覆盖,也会做同样的事情)。

这两个 if 变体之间有什么区别让我无法理解吗?他们是否可能考虑到 POCO 设计者可能覆盖 == 的可能性?

简而言之,如果我没有覆盖 ==,我是否使用 != 而不是 ReferenceEquals() 保存?

【问题讨论】:

    标签: c# .net entity-framework-4 inequality


    【解决方案1】:

    以下是不同的语义:

    • 如果您的意思是对象完全相同(身份检查),则必须使用ReferenceEquals()
    • 如果您的意思是对象具有相同的值(平等检查),则应使用object.Equals()
    • ==() 只能用于不可变类型。然后用它来测试是否相等。

    当然,相反的对应物是相应的。

    Here is a summary

    【讨论】:

    • 为什么是黄金法则If you want to know if two objects refer to the same instance USE ONLY ReferenceEquals? MSDN 声明For reference types other than string, == returns true if its two operands refer to the same object.msdn.microsoft.com/en-us/library/53k8ybth.aspx 不是挑战黄金法则,只是想了解它。
    • 只是因为它总是有效。 == 可能被错误地实现,这使得它可能存在问题。当我决定在一个项目中使我的对象不可变时,它挽救了我的生命,其中 == 被覆盖为相等而不是身份。因此,如果必须比较对象而不是值,我总是使用 ReferenceEquals。
    【解决方案2】:

    == 应该测试看看引用是否指向相同的位置,而 ReferenceEquals 测试看看它们是否包含相同的数据

    【讨论】:

    • 我认为这应该正好相反,tbh。
    • 嗯...经过一些快速测试 == 和 ReferenceEquals 产生相同的结果,但我想你是对的。哦,对我来说很好:)
    • 这是因为除非被覆盖,否则 == 运算符通常会执行引用相等检查。然而,当被覆盖时,它可能会或可能不会使用它。因此,如果要检查不可变类型的引用相等性,则不应使用 == 运算符。
    猜你喜欢
    • 2011-12-09
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多