首页 > 后端开发 > C++ > 如何在 C# 中正确重写 Equals() 和 GetHashCode() 进行有效的对象比较?

如何在 C# 中正确重写 Equals() 和 GetHashCode() 进行有效的对象比较?

DDD
发布: 2025-01-04 21:16:39
原创
209 人浏览过

How to Properly Override Equals() and GetHashCode() for Effective Object Comparison in C#?

重写 Equals() 和 GetHashCode() 以获得有效的对象等价

在追求对象相等性时,Equals() 和 GetHashCode() )方法发挥着关键作用。对于自定义类,有必要重写这些方法以建立有意义的比较和哈希机制。本文阐明了在RecommendationDTO 类的上下文中实现这些方法的正确方法,使其能够与 LINQ except() 方法无缝集成。

重写 Equals()

  1. 可空类型: 在提供的代码中, Equals() 方法检查空引用。但是,对于像 DateTime? 这样的可空类型,应该修改比较以适当地处理空值。
  2. 考虑所有属性: 相等比较应该考虑定义业务等价性的所有相关属性对象。在这种情况下,仅比较 ReferenceId,但可能还需要包含其他关键属性。

重写 GetHashCode()

  1. 哈希码计算: GetHashCode() 方法应根据用于的属性计算哈希码平等比较。由于 ReferenceId 用于相等,因此它也应该用于计算哈希码。
  2. 一致性哈希: 哈希码在同一对象的多次调用中应该保持一致。这可以确保具有相同属性的对象始终具有相同的哈希码,从而实现高效的哈希和查找操作。

示例实现

这是一个增强的实现RecommendationDTO的Equals()和GetHashCode()方法class:

public override bool Equals(object obj)
{
    var item = obj as RecommendationDTO;

    if (item == null || ReferenceId == Guid.Empty || item.ReferenceId == Guid.Empty)
    {
        return false;
    }

    return this.RecommendationId.Equals(item.RecommendationId);
}

public override int GetHashCode()
{
    if (ReferenceId == Guid.Empty)
    {
        throw new InvalidOperationException("ReferenceId cannot be Guid.Empty when calculating hash code.");
    }

    return this.RecommendationId.GetHashCode();
}
登录后复制

通过以这种方式实现 Equals() 和 GetHashCode(),RecommendationDTO 类现在可以有效地与 LINQ except() 方法一起使用,确保处理具有相同有意义属性的对象一样独特。

以上是如何在 C# 中正确重写 Equals() 和 GetHashCode() 进行有效的对象比较?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板