Я получил здесь после прочтения этого, и я не нашел соответствующего ответа. Поэтому, пожалуйста, не отмечайте это как дубликат, пока не прочитаете весь вопрос.
Я использовал рефлектор и посмотрел на 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
?