Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# !(ReferenceEquals())vs!=在实体框架4中_C#_.net_Entity Framework 4_Inequality - Fatal编程技术网

C# !(ReferenceEquals())vs!=在实体框架4中

C# !(ReferenceEquals())vs!=在实体框架4中,c#,.net,entity-framework-4,inequality,C#,.net,Entity Framework 4,Inequality,除非类专门重写为对象定义的行为。。。比较参考文献 在属性设置器中,我经常使用这种模式 private MyType myProperty; public MyType MyProperty { set { if (myProperty != value) { myProperty = value; // Do stuff like NotifyPropertyChanged }

除非类专门重写为对象定义的行为。。。比较参考文献

在属性设置器中,我经常使用这种模式

private MyType myProperty;

public MyType MyProperty
{
    set
    {
        if (myProperty != value)
        {
            myProperty = value;
            // Do stuff like NotifyPropertyChanged
        }
    }
}
但是,在实体框架生成的代码中,
if
语句替换为

    if (!ReferenceEquals(myProperty, value))
使用ReferenceEquals更显式(因为我想不是所有的C#程序员都知道==如果不被重写的话做同样的事情)

这两种if变体之间有什么区别吗?它们是否解释了POCO设计者可能已经覆盖
==
的可能性


简而言之,如果我没有覆盖
==
,我是否使用!=应测试引用是否指向相同的位置,而不是
ReferenceEquals()

==应测试引用是否指向相同的位置,而ReferenceEquals则测试它们是否包含相同的数据。以下是不同的语义:

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


我认为这应该是完全相反的,tbh.Hmm…经过一些快速测试==和ReferenceEquals产生相同的结果,但我想你是对的。这是因为除非重写==运算符,否则它通常执行引用相等性检查。但是,当被重写时,它可能会使用,也可能不会使用。因此,如果要检查不可变类型上的引用相等性,则不应使用==运算符。如果要知道两个对象是否引用同一实例,为什么要使用黄金法则
?MSDN声明
对于字符串以外的引用类型,==如果其两个操作数引用同一个对象,则返回true。
不挑战黄金法则,只想理解它。因为它总是有效的。==可能被错误地实现,这可能会造成问题。当我决定在一个项目中使我的对象不可变时,它救了我的命,在这个项目中,==被覆盖为相等而不是标识。所以我总是使用ReferenceEquals来比较对象,而不是值。