1

我在使用 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 数组中,但我已经在那里尝试了很多东西,所以我不知道该怎么做。或者还有其他更简单的方法来解决我的问题吗?

4

2 回答 2

5

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

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

于 2012-08-30T23:32:42.987 回答
1

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

于 2012-08-30T23:32:49.500 回答