String.Equals(a,b)如何不产生StackOverflowException?
在检查String ==
运算符时,我注意到它调用了String.Equals(string a, string b)
,意思是它只是一个传递。
检查String.Equals(string a, string b)
方法,我发现它使用==
运算符进行了相等性检查。 这是如何工作的,而不是像"x" == "x"
或"x" == "y"
这样的东西造成StackOverflowException
?
更新 :我让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); }
operator ==
调用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); }
正如你看到的,string相等的比较是使用if ((Object)a==(Object)b)
将string转换为object
,然后进行比较来完成的。 所以这不会调用string类中的重载运算符==
。
- ExpandoObject,DynamicObject和dynamic之间的区别
- 在Moq Callback()调用中设置variables值
- 如何在EF CF中设置POCO的默认值?
- 不能将types'System.Collections.Generic.IEnumerable <AnonymousType#1>'隐式转换为'System.Collections.Generic.List <string>
- Windows服务运行在什么目录?
- Cookie混淆与FormsAuthentication.SetAuthCookie()方法
- 如何在C#中模拟鼠标点击?
- 为什么代表参考types?
- 在WebRequest中强制执行基本身份validation