8

由于我的(单元)测试覆盖率仍然很低,不幸的是,我不得不以艰难的方式找到很多错误。因此,在重构期间,我严重依赖 C# 编译器的类型检查。

今天,我修复了重构过程中引入的一个错误,因为缺少x.Equals(aThingWrappingOriginalThing). 事实上bool Equals(object T),编译器没有抱怨。然而,90% 的时间我Equals()直接使用(而不是通过 BCL),我打算在逻辑上比较相同类型的对象。

现在我想知道为什么我从未见过有人Equals()为这种情况(在 C# 中)推广类型安全的版本。对此有最佳做法吗?

我很想对这些比较使用扩展方法,如下所示:

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

4

2 回答 2

5

You are looking for

EqualityComparer<T>.Default.Equals(x,y);

this supports IEquatable<T> (if implemented), else uses the potentially-boxing Equals(object); it supports classes and structs, with expected null-behaviour for both, including support for Nullable<T> (without boxing).

于 2012-07-10T20:23:15.357 回答
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)));
}
于 2012-07-10T20:18:27.883 回答