gpt4 book ai didi

c# - 为什么我不应该使用反射实现 Equals 和 GetHashCode?

转载 作者:太空狗 更新时间:2023-10-29 17:39:39 26 4
gpt4 key购买 nike

我有一些带有一堆字段的对象,我发现自己必须实现 GetHashCode 和 Equals。手动遍历每个字段很痛苦,所以我这样写:

public override int GetHashCode()
{
int hash = 17;
foreach (PropertyInfo p in GetType().GetProperties())
{
hash = hash * 23 + p.GetValue(this, null).GetHashCode();
}
return hash;
}

public override bool Equals(object obj)
{
foreach (PropertyInfo p in GetType().GetProperties())
{
if (p.GetValue(obj, null) != p.GetValue(this, null))
return false;
}
return true;
}

除了速度方面的考虑,为什么我不应该这样实现它们?

最佳答案

以下是我会避开这条路线的几个原因

  • 比较字段而不是属性要可靠得多
  • 您的代码做出了错误的假设,即如果两个对象是相同的引用(您使用的是 ==),则它们被认为是相等的。情况并非如此,因为许多类型通过 .Equals 实现值相等。将两个不同的引用视为 Equals 是非常有可能且合法的,并且会击败您的测试。
  • 如果在您的代码库中广泛使用这种形式的相等性,当对象图具有循环时,它很容易导致无限递归。
  • GetHashCode 方法忽略属性可能为 null

下面是一个类型的具体示例,它会在您的应用程序中导致无限递归

class C1 {
public object Prop1 { get; set; }
};

var local = new C1();
local.Prop1 = local;
var x = local.GetHashCode(); // Infinite recursion

关于c# - 为什么我不应该使用反射实现 Equals 和 GetHashCode?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4379206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com