Objetos iguais - qual é a lógica básica para objetos puros ou tipos de referência que não substituem os iguais?
Cheguei aqui depois de leresta e não encontrei uma resposta relevante. Portanto, não marque isso como duplicado até ler a pergunta toda.
Eu tenho usado um refletor e olhei paraObject.Equals
.O que eu vi é:
[__DynamicallyInvokable, TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public virtual bool Equals(object obj)
{
return RuntimeHelpers.Equals(this, obj);
}
ERuntimeHelpers.Equals
se parece com isso:
// 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);
Agora não consigo ver a implementação deRuntimeHelpers.Equals
mas pela descrição, se os dois objetos não forem da mesma instância e não forem nulos, chamará oobject.Equals
método novamente e eu entraria em um loop (eu estou falando sobreobjetos puros)
Quando digo objetos puros, quero dizer algo assim:
object pureObj1 = new object();
object pureObj2 = new object();
bool areEql = pureObj1.Equals(pureObj2);
Por documentação, isso deve chamarObject.Equals
e pegue umfluxo de pilha recusativo. Eu acho que talvez a documentação esteja errada e isso verifiqueigualdade de referência para objetos básicos - mas eu queria ter certeza.
Bottom line:
Ao comparar dois objetos puros (por exemplo, não converter uma string no objeto) por meio de umEquals
chamada - como determina se são iguais? - O que acontece se eu não substituir oEquals
método e eu chamoEquals
em dois objetos?
P.s. existe alguma maneira que eu possa ver oRuntimeHelpers.Equals
Código fonte?