gpt4 book ai didi

c# - 为什么 ReferenceEquals 和 == 运算符的行为与 Equals 不同

转载 作者:行者123 更新时间:2023-11-30 12:50:50 24 4
gpt4 key购买 nike

我有一个不覆盖任何相等成员\运算符的实体。
当比较它们的两个代理时(我从 Nhibernate session 得到它们)结果根据相等方法改变:

  • ReferenceEquals(first, second) - 错误。
  • 第一 == 第二 - 假
  • 等于(第一,第二)- 真。

这更奇怪,因为它们都存在于同一个 session 上下文中,并且根据 Nhibernate docs :

NHibernate only guarantees identity ( a == b , the default implementation of Equals()) inside a single ISession!`

和:

The instance is currently associated with a persistence context. It has a persistent identity (primary key value) and, perhaps, a corresponding row in the database. For a particular persistence context, NHibernate guarantees that persistent identity is equivalent to CLR identity (in-memory location of the object).

那么为什么不是所有的相等方法都返回 true?


更新:
我通过这种方式获取实体,查询 ChildEntity 的 session 并使用 Linq 的 select 获取父实体,类似于:

var childs = session.Query<Child>();
var parents = childs.Select(x => x.ParentEntity).ToList();

最佳答案

编辑

您可能正在使用结构?见下文


我想引用类型显示了您期望的行为:

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));
} }

打印:

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));
} }

输出:

True
True
False

理由:

Equals() 的默认实现来自 ValueType 类,它是所有值类型的隐式基类。您可以通过在结构中定义自己的 Equals() 方法来覆盖此实现。 ValueType.Equals() 在比较不同(动态)类型的对象时总是返回 false。如果对象属于同一类型,它会通过为每个字段调用 Equals() 来比较它们。如果其中任何一个返回 false,则整个过程停止,最终结果为 false。如果逐个字段的比较都返回true,则最终结果为true

关于c# - 为什么 ReferenceEquals 和 == 运算符的行为与 Equals 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com