【发布时间】:2012-02-16 19:24:38
【问题描述】:
我试图查看为 C# 中字符串类中的比较运算符实现的代码。发现是这样的:
//THIS IS NOT WHAT I MEANT
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}
//THIS IS WHAT I SEE REALLY and the above is what I would expect to see
public static bool Equals(string a, string b)
{
return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}
我不知道是不是反射器在欺骗我,但是当我尝试为我自己的类实现这个策略时,我在 Equals 和重载的 == 运算符之间得到了一个无限循环(如预期的那样) .字符串类有什么不同还是我的反射器在报告
static Equals(object o1, object o2)
Object 类的方法成为 String 类的一部分?
【问题讨论】:
-
Reflector 对 objA.Equals 方法有何看法?它不能与静态 Equals 方法相同,因为它是一个实例方法。根据您提供的代码,我没有看到无限循环。你能告诉我们实例 Equals 方法吗?
-
对不起,我更新了这个问题,我发布了错误的定义...
-
我认为的无限是在 Equals(string a, string b) 中调用 (a==b) 时发生的。 a 和 b 的 STATIC 类型是字符串,因此调用了重载运算符 ==。我在我的简单示例中对其进行了检查,现在我不确定这里是否存在我看不到的东西,或者它是否是反射器。跨度>
-
您可以通过完全不使用
==运算符来避免所有这些混淆。使用ReferenceEquals来检查引用是否相等;它远不那么模棱两可。
标签: c# string operator-overloading equality