gpt4 book ai didi

c# - 为什么两次比较只调用一次方法 Equals?

转载 作者:太空宇宙 更新时间:2023-11-03 17:51:13 25 4
gpt4 key购买 nike

考虑以下简单程序。

using System;


namespace CompareClasses
{

class A
{
public override bool Equals(object obj)
{
Console.WriteLine("\nHi, It is me A!");
return base.Equals(obj);
}
}

class Program
{
static void Main(string[] args)
{
A a1 = new A();
A a2 = new A();
A a3 = a1;

Console.WriteLine("compare a1 to a2: {0}", Equals(a1, a2));
Console.WriteLine("compare a1 to a3: {0}", Equals(a1, a3));
}
}
}

它的输出如下

Hi, It is me A!
compare a1 to a2: False
compare a1 to a3: True

所以问题是为什么消息 Hi, It is me A!只显示一次?

虽然如果查看 MSIL 代码,那么我们可以看到静态方法 Equals 被调用了两次。

  IL_000f:  ldstr      "compare a1 to a2: {0}"
IL_0014: ldloc.0
IL_0015: ldloc.1
IL_0016: call bool [mscorlib]System.Object::Equals(object,
object)
IL_001b: box [mscorlib]System.Boolean
IL_0020: call void [mscorlib]System.Console::WriteLine(string,
object)
IL_0025: nop
IL_0026: ldstr "compare a1 to a3: {0}"
IL_002b: ldloc.0
IL_002c: ldloc.2
IL_002d: call bool [mscorlib]System.Object::Equals(object,
object)
IL_0032: box [mscorlib]System.Boolean
IL_0037: call void [mscorlib]System.Console::WriteLine(string,

最佳答案

因为 object.Equals(obj1, obj2)将首先使用 object.ReferenceEquals 来检查两个对象是否是相同的引用。对于 a1 和 a3 也是如此。

来自 MSDN:

The static Equals(Object, Object) method indicates whether two objects, objA and objB, are equal. It also enables you to test objects whose value is null for equality. It compares objA and objB for equality as follows:

  1. 它确定两个对象是否表示相同的对象引用。如果是,该方法返回 true。此测试等效于调用 ReferenceEquals 方法。此外
  2. 如果objAobjB 都是null,则该方法返回true。它确定 objAobjB 是否为 null。如果是,则返回 false。如果这两个对象不代表同一个对象引用且都不为空,
  3. 它调用 objA.Equals(objB) 并返回结果。这意味着,如果 objA 覆盖了 Object.Equals(Object) 方法,则会调用此覆盖。

这就是为什么只有这个会调用你重写的 Equals 的原因:

Console.WriteLine("compare a1 to a2: {0}", Equals(a1, a2));

因为两个对象都是不同的引用并且都不为空。

关于c# - 为什么两次比较只调用一次方法 Equals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25184507/

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