c# - 类型安全的 Equals()

标签 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

最佳答案

你在找

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

这支持 IEquatable<T> (如果实现),否则使用潜在装箱 Equals(object) ;它支持类和结构,两者都具有预期的空行为,包括对 Nullable<T> 的支持(没有装箱)。

关于c# - 类型安全的 Equals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11421197/

相关文章:

c# - 按 unicode 类别拆分字符串

c# - 我们可以缩短 s1.Equals(s2, StringComparison.InvariantCultureIgnoreCase) 吗?

java - 如何从对象的地址计算 hashCode()?

java - @SafeVarargs 是否适合此方法的注释?

c - 如何在不影响性能的情况下实现原始类型的类型安全?

c# - 使用 LINQ 从子列表中选择最大值

c# - C# 中的动画面板

c# - 保存图像时如何找到一般 GDI+ 错误的原因?

java - 为什么我在 Java HashMap 中得到重复的键?

java - 如何通过.class获取泛型类型?