String.Equals(a,b)如何不产生StackOverflowException?

Dus*_*vis 158 .net c#

在检查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回购中添加了一个问题.

字符串平等

小智 216

您的反编译器有一个错误.真正的代码不会检查a == b,它会检查(Object)a == (Object)b,绕过重载的运算符.

  • "你的反编译器有一个bug".放下麦克风. (72认同)
  • 你可以链接到源代码很棒. (7认同)
  • @Aravol是的,但源头最近才被发布 (4认同)
  • 不过,它在任何情况下都是相当混淆的代码.一个简单的`object.ReferenceEquals(a,b)`会更加清晰.. (2认同)

Cri*_*nSO 50

是Microsoft的真实代码.运算符==实现

public static bool operator == (String a, String b) {
   return String.Equals(a, b);
}
Run Code Online (Sandbox Code Playgroud)

操作员==调用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);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,字符串相等性的比较是通过if ((Object)a==(Object)b)将字符串转换为object然后进行比较来完成的.所以这不会==在字符串类中调用重载的运算符.