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 저장소에 문제를 추가했습니다.
답변
디 컴파일러에 버그가 있습니다. 실제 코드 는 오버로드 된 연산자를 무시하고 a == b
검사하고 검사합니다 (Object)a == (Object)b
.
답변
다음 은 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
한 다음 비교를 수행하여 수행됩니다. 따라서 이것은 ==
문자열 클래스에서 오버로드 된 연산자 를 호출하지 않습니다 .