gpt4 book ai didi

c# - 为什么此对象相等性测试失败?

转载 作者:行者123 更新时间:2023-11-30 13:12:45 28 4
gpt4 key购买 nike

参加以下类(class)和单元测试。

public class Entity
{
public object Id { get; set; }

public override bool Equals(object obj)
{
return this == (Entity)obj;
}

public static bool operator == (Entity base1, Entity base2)
{
if (base1.Id != base2.Id)
{
return false;
}

return true;
}

public static bool operator != (Entity base1, Entity base2)
{
return (!(base1.Id == base2.Id));
}
}

        [TestMethod]
public void Test()
{
Entity e1 = new Entity { Id = 1 };
Entity e2 = new Entity { Id = 1 };
Assert.IsTrue(e1 == e2); //Always fails
}

有人可以解释为什么失败吗?

最佳答案

您的 Id 属性属于 object 类型。当您使用 1 作为每个实例的 Id 构造两个实例时,您最终会得到两个不同的装箱对象。然后,您将使用 reference 相等性来比较这些对象。

解决此问题的建议更改:

  • 如果合适,将 Id 的类型更改为 int 类型。
  • 使用静态object.Equals 方法来比较Id 而不是==

这两种方法都可以,但我认为第一种更好。

如果您有兴趣,还有许多其他方法可以使实现更清晰,但我知道这可能只是一个虚拟示例。快速列表一目了然:

  • 您应该覆盖 GetHashCode 以及 Equals
  • 您的 Equals 覆盖不应无条件地执行强制转换,因为如果对象类型错误,这将引发异常。如果类型错误,则返回false。
  • 您当前的 == 实现可以简化为 just

    return base1.Id == base2.Id;
  • 您的 == 实现应该执行无效检查
  • 通常最好通过返回 !(base1 == base2) 来实现 !=,除非您需要专业行为。
  • 在非密封类中覆盖 Equals 可能会出现问题。除非您计划继承,否则值得密封该类(IMO - 这可能会引起争议)。

关于c# - 为什么此对象相等性测试失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/916608/

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