String.Equals (a, b)는 어떻게 StackOverflowException을 생성하지 않습니까?


159

String ==연산자를 검사하는 동안 나는 그것이 호출 String.Equals(string a, string b)이라는 것을 알았습니다 .

심사 String.Equals(string a, string b)방법을, 나는 그것이 사용하여 평등 체크한다는 것을 참조 ==연산자를. 실제로 어떻게 작동하고 또는 StackOverflowException같은 일을 할 때 발생하지 않습니까?"x" == "x""x" == "y"

업데이트 : JetBrains에 알리고 dotPeek의 우선 순위를 결정했습니다. https://youtrack.jetbrains.com/issue/DOTP-6789

또한 ILSpy의 GitHub 저장소에 문제를 추가했습니다.

문자열 평등


무료 .NET 리플렉터 (v6)는 C #에서 "잘못된"것으로 표시하지만 (예 : 그냥 표시 a == b) VB.NET에서는 정확합니다 a Is b.
Mark Hurd

답변:


217

디 컴파일러에 버그가 있습니다. 실제 코드 는 오버로드 된 연산자를 무시하고 a == b검사하고 검사합니다 (Object)a == (Object)b.


4
@Aravol true, 그러나 소스는 최근에 릴리스되었습니다
Dustin Davis

2
그럼에도 불구하고 꽤 난독 화 된 코드입니다. 간단한 object.ReferenceEquals(a,b)것이 훨씬 명확합니다.
Voo

1
@Voo 현재 버전이 더 명확하다고 주장합니다. 당신에 대해 아무것도 알 필요가 없습니다 object.ReferenceEquals(경우에 무엇 예를 들면, 캐스트 버전 a입니다 null만큼 당신이 캐스팅이 무엇인지 알고, 그것을 확실히 난독 아니에요?)합니다.
wchargin December

72
"디 컴파일러에 버그가 있습니다." 마이크를 떨어 뜨립니다.
espinchi

1
@Voo 내 추측 : MS 고려 (Object)a == (Object)b하고 Object.ReferenceEquals(a, b)대한 동등하게 읽을 수 있지만, 경우에 그것은 나를 놀라게하지 것이다 Object.ReferenceEquals(a, b)단지 최대 인라인 깊이에 도달 할 경우 인라인 가져 오지의 약간의 기회가있다. 사용자 코드의 가장 엄격한 루프는 결국 MS 코드를 호출하기 때문에 MS는 많은 미세 최적화를 수행합니다.

50

다음 은 Microsoft의 실제 코드입니다. 운영자 ==는 s를 구현

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

다음 과 같이 구현되는 운영자 ==호출 :String.Equals

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);
}

보시다시피 문자열 동등성 비교는 문자열을 if ((Object)a==(Object)b)캐스팅 object한 다음 비교를 수행하여 수행됩니다. 따라서 이것은 ==문자열 클래스에서 오버로드 된 연산자 를 호출하지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.