除非一个类专门覆盖为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()保存?

最佳答案

以下是不同的语义:


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


当然,相反的意思是相应的。

Here is a summary

10-06 06:01