【发布时间】:2015-01-14 15:28:26
【问题描述】:
我是在阅读 this 后来到这里的,但我没有找到相关的答案 - 所以请在阅读整个问题之前不要将其标记为重复。
我一直在使用反射器并查看了Object.Equals。我看到的是:
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
而RuntimeHelpers.Equals 看起来像这样:
// System.Runtime.CompilerServices.RuntimeHelpers
/// <summary>Determines whether the specified <see cref="T:System.Object" /> instances are considered equal.</summary>
/// <returns>true if the <paramref name="o1" /> parameter is the same instance as the <paramref name="o2" /> parameter, or if both are null, or if o1.Equals(o2) returns true; otherwise, false.</returns>
/// <param name="o1">The first object to compare. </param>
/// <param name="o2">The second object to compare. </param>
[SecuritySafeCritical]
[MethodImpl(MethodImplOptions.InternalCall)]
public new static extern bool Equals(object o1, object o2);
现在我看不到RuntimeHelpers.Equals 的实现,但根据描述,如果两个对象不是同一个实例并且不为空,它将再次调用object.Equals 方法,我会进入一个循环(我说的是纯对象)。
当我说纯对象时,我的意思是这样的:
object pureObj1 = new object();
object pureObj2 = new object();
bool areEql = pureObj1.Equals(pureObj2);
根据文档,这应该调用 Object.Equals 并获得 recusive stackoverflow。我想可能是文档有误,这会检查基本对象的引用相等性 - 但我想确定一下。
底线:
通过Equals 调用比较两个纯对象(例如,不将字符串转换为对象)时 - 它如何确定它们是否相等? - 如果我不覆盖Equals 方法并且我在两个对象上调用Equals 会发生什么?
附:无论如何我可以看到RuntimeHelpers.Equals源代码吗?
【问题讨论】:
-
顺便说一句,没有必要再使用反射器了,你可以使用referencesource.microsoft.com
-
不幸的是,2.0 SSCLI 没有 RH.Equals 的“ecall”。这似乎是一个较新的结构。无法查看此方法的作用。可能,它会检查
obj.GetType() == typeof(object)是否会短路比较。 -
我们只会确定何时发布 .NET CLR 源代码(似乎已确定)。或者,当 Hans Passant 注意到这个问题时。
-
RuntimeHelpers.Equals的描述从何而来?我没有从 Reflector 中得到它,也没有在 referencesource.microsoft.com/#mscorlib/system/runtime/… 中看到它,并且在对该方法使用智能时我没有得到它。 -
有人向汉斯发送蝙蝠信号!