由于我的(单位)测试覆盖率仍然很低,不幸的是,我必须找到很多错误。因此,在重构期间,我严重依赖于C#编译器的类型检查。
今天,我通过错过x.Equals(aThingWrappingOriginalThing)
的一行修复了重构过程中引入的错误。由于它是bool Equals(object T)
,编译器没有抱怨。但是,有90%的时间我直接使用Equals()
(而不是通过BCL),我打算在逻辑上比较相同类型的对象。
现在我想知道为什么我从未见过有人在这种情况下(在C#中)推广Equals()
的类型安全版本。这是最好的做法吗?
我很想对这些比较使用扩展方法,如下所示:
public static bool SafeEquals<T>(this T a, T b)
{
if (a == null) return b == null;
return a.Equals(b);
}
public static bool SafeEquals<X>(this IEquatable<X> a, IEquatable<X> b)
{
if (a == null) return b == null;
return a.Equals(b);
}
这些可以优化吗?
以下是关于我发现的主题的唯一博文,对于java: http://rickyclarkson.blogspot.com/2006/12/making-equalsobject-type-safe.html
答案 0 :(得分:5)
您正在寻找
EqualityComparer<T>.Default.Equals(x,y);
这支持IEquatable<T>
(如果已实施),否则使用潜在的拳击Equals(object)
;它支持类和结构,两者都有预期的空行为,包括对Nullable<T>
的支持(没有装箱)。
答案 1 :(得分:2)
我看到的对我来说很好。
我的2美分:我认为跳过空检查会更简单,并使用它:
public static bool SafeEquals<T>(this T a, T b)
{
return object.Equals(a, b);
}
极少数情况会偏离预期的行为。其中之一是Equals
在两个对象都是同一个对象时返回false(无论如何都不应该发生)。
作为参考,这里是反编译的object.Equals
,所以你可以自己看看会发生什么。
public static bool Equals(object objA, object objB)
{
return ((objA == objB) || (((objA != null) && (objB != null)) && objA.Equals(objB)));
}