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来比较对象,而不是值。