【问题标题】:Calling Equals returns false every time, even when values are same (C#)每次调用 Equals 都会返回 false,即使值相同 (C#)
【发布时间】:2012-08-30 23:29:45
【问题描述】:

我在使用 XNA 屏幕的 Windows 窗体应用程序中遇到问题。我想看看在完成多行代码后对象是否发生了变化。如果是这样,它应该在 Title 中添加一个 * 来告诉用户文件做了更改但没有保存。

为此,我复制对象并在这些行之后检查它们是否相等。

 MapSquare afterChange = TileMap.GetMapSquareAtPixel((int)mouseLoc.X,(int)mouseLoc.Y);
 MapSquare beforeChange = (MapSquare)afterChange.Clone();
 // code.....
 if (!Object.Equals(beforeChange,afterChange))
 parentForm.MapChanged = true; // this happens even when no changes happend

这个错误一定是在我使用 Iclonable 接口的克隆方法中,因为即使我在复制它后立即检查等于,它也不起作用。

public object Clone()
    {
        return new MapSquare(this);
    }
 private MapSquare(MapSquare squere)
    {
        this.LayerTiles = (int[])squere.LayerTiles.Clone();
        this.CodeValue = squere.CodeValue;
        this.Behavior = squere.Behavior;

    }

错在哪里?我认为它在 layertiles 数组中,但我已经在那里尝试了很多东西,所以我不知道该怎么做。或者还有其他更简单的方法可以解决我的问题吗?

【问题讨论】:

    标签: c# xna compare equals


    【解决方案1】:

    您需要为您的 MapSquare 类型覆盖 Object.Equals 以使其根据值比较相等性。默认情况下,Object.Equals 仅在两个变量引用相同的实际实例时才返回 true,而不是在它们具有相同的成员值时。

    如果您打算这样做,我建议您也实施IEquatable<MapSquare>

    【讨论】:

    • 确保也覆盖 GetHashCode!
    • 我认为 Equals 比较字段和 ReferenceEquals 并且 == 运算符比较它们是否指向同一个实例。那是错的吗?那么 Equals 和 ReferenceEquals 有什么区别呢?感谢您的帮助:)
    • @RobinBetka Equals,对于类,基本上与 ReferenceEquals 相同,除非您覆盖它。您需要覆盖 Object.Equals 以获取成员比较。 (对于结构,这是真的,但对于类则不然)。如果您覆盖 equals,您通常还应该实现 GetHashCode 等。请参阅链接为 IEquatable<T>的文档
    【解决方案2】:

    除非您重载相等运算符,否则您测试的是两个对象 references 是否相等,而不是它们是否包含相同的值。

    【讨论】:

      猜你喜欢
      • 2023-03-06
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多