!(ReferenceEquals())和!=在Entity Framework 4中有何区别?

3

除非一个类特别覆盖了Object定义的行为,否则ReferenceEquals和==执行相同的操作...比较引用。

在属性设置器中,我通常使用以下模式

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() 是否更安全?

2个回答

5
以下是不同的语义:
  • 如果您想要检查对象是否完全相同(身份检查),则必须使用ReferenceEquals()
  • 如果您想要检查对象是否具有相同的值(相等性检查),则应使用object.Equals()
  • 仅适用于不可变类型时,才能使用==()。然后使用它来测试相等性。
当然,反向对应也是如此。
这里有一篇总结:链接

为什么黄金法则是“如果您想知道两个对象是否引用同一实例,请仅使用ReferenceEquals”?MSDN指出:“对于除字符串之外的引用类型,==返回true,如果它的两个操作数引用同一个对象。”http://msdn.microsoft.com/en-us/library/53k8ybth.aspx 不挑战黄金法则,只是想理解它。 - Eric J.
仅仅因为它总是有效并不意味着"=="操作符被正确实现,这可能会带来问题。当我在一个项目中决定将我的对象设置为不可变时,它拯救了我的生命,因为"=="被重载用于相等而非身份。因此,如果需要比较对象而不是值,我总是使用ReferenceEquals。 - jdehaan

-3

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


我认为说实话应该是完全相反的。 - Anton
嗯...经过一些快速测试,==和ReferenceEquals产生了相同的结果,但我想你是对的。哦,好吧-扣分给我 :) - Buildstarted
这是因为除非被覆盖,否则 == 运算符通常执行引用相等性检查。但是,如果被覆盖,它可能会或可能不会使用这个。因此,如果您想在不可变类型上检查引用相等性,则不应使用 == 运算符。 - Anton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接