C# 比较从NHibernate加载的对象时==是否保证工作?

C# 比较从NHibernate加载的对象时==是否保证工作?,c#,nhibernate,C#,Nhibernate,我们知道:NHibernate建议重写Equals()和GetHashCode()。Microsoft建议您不要在非不变类型中重写运算符==。因此,客户端代码似乎不应该使用运算符==来比较对象。例如,假设Foo重载GetHashCode()并正确等于,则: var foo1 = session.Get<Foo>(23); ... var foo2 = session.Get<Foo>(23); Assert.IsTrue( foo1 == foo2 ); //

我们知道:NHibernate建议重写Equals()和GetHashCode()。Microsoft建议您不要在非不变类型中重写运算符==。因此,客户端代码似乎不应该使用运算符==来比较对象。例如,假设Foo重载GetHashCode()并正确等于,则:

var foo1 = session.Get<Foo>(23);

 ...

var foo2 = session.Get<Foo>(23);

Assert.IsTrue( foo1 == foo2 );  // May fail!
Assert.IsTrue( foo1.Equals(foo2)); // Guaranteed!
var foo1=session.Get(23);
...
var foo2=session.Get(23);
Assert.IsTrue(foo1==foo2);//可能会失败!
Assert.IsTrue(foo1.Equals(foo2));//放心!

这是正确的总和吗?

我相信你的总和是正确的。Equals()是一个相等比较。对于一个简单的类型,比如字符串或int==肯定可以工作,但是对于一个对象,我认为最好使用Equals()。

相等运算符
==
将进行引用相等比较。例如,
foo1
的引用是否等于
foo2

的引用Hibernate会话保证示例代码中的两个get调用实际返回相同的对象实例


因此,对于属于同一会话的hibernate对象,==操作符将可靠地工作。

您能链接到Microsoft推荐吗?我很好奇。另一方面,对象/对象部分的可变性仍然可能导致
Equals
和更具体地说,
GetHashCode
出现问题。我想知道定义
==
的额外风险因素是什么。我不确定我是否理解你的问题。您的标题是否意味着您想知道默认的
==
操作符是否始终有效?或者,您只是担心即使是重载的
=
运算符也可能由于某种奇怪的原因而失败?Microsoft建议:@dlev-我的问题是,使用运算符==比较从NHibernate加载的两个对象是否安全。您能链接到该保证吗?就我而言,它似乎失败了。看一看第章。我在一个hibernate项目中经常使用==操作符,它总是像预期的那样为我工作。