类型安全等于()

时间:2012-07-10 20:13:39

标签: c# equals type-safety

由于我的(单位)测试覆盖率仍然很低,不幸的是,我必须找到很多错误。因此,在重构期间,我严重依赖于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

2 个答案:

答案 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)));
}