由于我的(单元)测试覆盖率仍然很低,不幸的是,我不得不费力地找出很多错误。因此,在重构期间,我严重依赖 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
最佳答案
你在找
EqualityComparer<T>.Default.Equals(x,y);
这支持 IEquatable<T>
(如果实现),否则使用潜在装箱 Equals(object)
;它支持类和结构,两者都具有预期的空行为,包括对 Nullable<T>
的支持(没有装箱)。
关于c# - 类型安全的 Equals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11421197/