Como String.Equals (a, b) não produz um StackOverflowException?


159

Ao examinar o String == operador, notei que ele chama String.Equals(string a, string b), o que significa que é apenas uma passagem.

Examinando o String.Equals(string a, string b)método, vejo que ele faz uma verificação de igualdade usando o ==operador. Como isso está realmente funcionando e não está causando um problema StackOverflowExceptionao fazer algo como "x" == "x"ou"x" == "y" ?

Atualização : informei o JetBrains e eles fizeram disso uma prioridade crítica para o dotPeek. https://youtrack.jetbrains.com/issue/DOTP-6789

Também adicionei um problema no repositório GitHub do ILSpy.

Igualdade de Cordas


Os .NET Reflector (v6) free exibe-o "errado" em C # (ou seja, isso só mostra a == b), mas correto em VB.NET: a Is b.
Mark Hurd

Respostas:


217

Seu descompilador possui um erro. O código real não verifica a == b, verifica (Object)a == (Object)b, ignorando o operador sobrecarregado.


4
@Aravol verdade, mas a fonte foi lançada recentemente recentemente
Dustin Davis

2
É um código bastante ofuscado em qualquer caso. Um simples object.ReferenceEquals(a,b)seria muito mais claro ..
Voo

1
@ Voo eu diria que a versão atual é mais clara. Você não precisa saber nada sobre object.ReferenceEqualscom a versão elenco (por exemplo, o que se aé null?), E, desde que você saiba o elenco é, certamente não é ofuscado.
wchargin

72
"Seu descompilador tem um erro". Solta o microfone.
espinchi 11/12/14

1
@Voo Meu palpite: MS considerar (Object)a == (Object)be Object.ReferenceEquals(a, b)quase igualmente legível, mas não me surpreenderia se Object.ReferenceEquals(a, b)só tem uma pequena chance de não ser inlined se a profundidade máxima em linha é atingido. O MS realiza muitas micro otimizações, já que a maioria dos loops apertados no código do usuário acaba chamando o código do MS.

50

Aqui está o código real da Microsoft. O operador ==é implementado um s

public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}

==chamadas de operador String.Equals que são implementadas como:

public static bool Equals(String a, String b) {
    if ((Object)a==(Object)b) {
        return true;
    }

    if ((Object)a==null || (Object)b==null) {
        return false;
    }

    if (a.Length != b.Length)
        return false;

    return EqualsHelper(a, b);
}

Como você vê, a comparação para a igualdade de cadeias é feita usando a if ((Object)a==(Object)b)conversão da cadeia objecte, em seguida, fazendo a comparação. Portanto, isso não chamará o operador sobrecarregado ==na classe string.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.