我有一个实体,它不会覆盖任何平等成员\运算符。
当比较它们的两个代理时(我从Nhibernate session
) 结果根据相等方法变化:
- ReferenceEquals(第一,第二) - false。
- 第一个 == 第二个 - false
- 等于(第一,第二)- true。
这更奇怪,因为它们都存在于同一会话上下文中,并且根据休眠文档:
NHibernate 仅保证同一性( a == b ,默认值
在单个 ISession 中实现 Equals())!`
And:
该实例当前与持久性上下文关联。它
有一个持久的身份(主键值),并且也许有一个
数据库中的相应行。为了一份特别的坚持
上下文中,NHibernate 保证持久标识是等价的
CLR 标识(对象在内存中的位置)。
那么为什么不是所有的相等方法都返回 true 呢?
Update:
我以这种方式获取实体,查询子实体的会话并使用 Linq 获取父实体select
,类似于:
var childs = session.Query<Child>();
var parents = childs.Select(x => x.ParentEntity).ToList();
Edit
您可能正在使用结构?见下文
我认为引用类型显示了您期望的行为:
public class Program {
class X { int x,y; }
public static void Main(string[] args)
{
X a = new X();
X b = new X();
System.Console.WriteLine(a == b);
System.Console.WriteLine(a.Equals(b));
System.Console.WriteLine(Equals(a,b));
System.Console.WriteLine(ReferenceEquals(a,b));
} }
Prints:
False
False
False
False
对于结构体,情况有所不同(a==b
测试,它不编译结构:)
public class Program {
struct X { int x,y; }
public static void Main(string[] args)
{
X a = new X();
X b = new X();
//System.Console.WriteLine(a == b);
System.Console.WriteLine(a.Equals(b));
System.Console.WriteLine(Equals(a,b));
System.Console.WriteLine(ReferenceEquals(a,b));
} }
Output:
True
True
False
理由:
Equals() 的默认实现来自类ValueType
,它是所有值类型的隐式基类。您可以通过在结构中定义自己的 Equals() 方法来覆盖此实现。ValueType.Equals()
当比较不同(动态)类型的对象时,总是返回 false。如果对象属于同一类型,它通过调用来比较它们Equals()
对于每个字段。如果其中任何一个返回 false,则整个过程停止,最终结果为 false。如果所有逐字段比较都返回 true,则最终结果为 true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)